欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HeadFirst设计模式_读书笔记_004_单例模式

程序员文章站 2022-05-17 18:53:48
...

单例模式:确保一个类只有一个实例,并提供一个全局访问点。通常被用来管理公共资源。例如,数据库连接池或是线程池。

public class Singleton {
	
	private static Singleton instance;
	
	private Singleton()
	{
		System.out.println("There is only on Singleton ");
	}
	
	public static Singleton getInstance()
	{
		if(instance == null)
		{
			instance = new Singleton();
		}
		return instance;
	}

}

 上面这种写法在多线程下可能会出现问题。假如现在有两个线程A,B, A和B同时进入方法getInstance, A 判断instance为Null,调用私有构造方法创建Singleton的实例,此时B也刚好进入getInstance方法,A还未创建实例成功,此时instance也为null,所以B线程也会调用构造方法创建实例。此时就会出现多线程灾难了。

   解决的方法1: 将 getinstance方法前增加关键字:synchronized 关键字。迫使每个线程进入这个方法前先等候别的线程离开该方法。

	public synchronized static Singleton getInstance()
	{
		if(instance == null)
		{
			instance = new Singleton();
		}
		return instance;
	}

 这样做可以解决多线程灾难问题,但是会降低性能。事实上,只有在第一次调用getInstance()方法,即instance 还没有被实例之前才需要同步。

    解决方法2:使用'急切'创建实例,而不是等到要用的时候再创建。

 

public class Singleton2 {
	
	private static Singleton2 instance = new Singleton2();
	
	private Singleton2()
	{
		
	}
	
	public static Singleton2 getInstance()
	{
		return instance;
	}

}

 解决方法3:用双向检查加锁。在getInstance()方法中减少使用同步。

public class Singleton3 {
	private Singleton3()
	{
		
	}
	
	private static volatile Singleton3 instance;

	public static Singleton3 getInstance()
	{
		if(instance == null)
		{
			synchronized(Singleton3.class)
			{
				if(instance == null)
				{
					instance = new Singleton3();
				}
			}
		}
		return instance;
	}
}

 

相关标签: java 单例模式