(21)有些类也需计划生育——单例模式

单例模式

保证一个类仅有一个实例,并提供一个访问它的全局访问点。(摘抄)

解决的问题:保证一个类在内存中的对象唯一性。

比如:多程序读取一个配置文件时,建议配置文件封装成对象。会方便操作其中数据,又要保证多个程序读到的是同一个配置文件对象,就需要该配置文件对象在内存中是唯一的。

public class Singleton
{
	private Singleton(){}
	
	private static Singleton singleton;
	
	public static Singleton getSingleton()
	{
		if (singleton == null)
		{
			singleton = new Singleton();
		}
		return singleton;
	}
}

class Client
{
	public static void main()
	{
		Singleton singleton1 = Singleton.getSingleton();
		Singleton singleton2 = Singleton.getSingleton();
		
		if (singleton1 == singleton2)
		{
			System.out.println("yes");
		}
		else 
		{
			System.out.println("no");
		}
	}
}

上面这种单例模式的类加载方式被称为懒汉式(延迟加载方式)

下面这种为饿汉式

public class Singleton
{
	private Singleton(){}
	
	private static Singleton singleton = new Singleton();
	
	public static Singleton getSingleton()
	{
		return singleton;
	}
}

饿汉式在多线程时不会重复生成实例,因为静态初始化让它在程序加载的时候已经生成实例了,懒汉式如果要在多线程时也不出问题,那么需要双重锁定

public class Singleton
{
	private Singleton(){}
	
	private static Singleton singleton;
	
	public static Singleton getSingleton()
	{
		if (singleton == null)
		{
			synchronized (Singleton.class) 
			{
				if (singleton == null)
				{
					singleton = new Singleton();
				}	
			}
		}
		return singleton;
	}
}

这样懒汉式也可以在多线程时调用了。

文章导航