HeadFirst design pattern笔记-单例模式

单例模式:确保一个类只有一个实例,并提供一个全局访问点。单例模式的构造方法是私有的,所以不能从外部创建这个类,这样很自然想到定义静态方法返回这个类的实例的方式。

实现的方式:

1.线程同步方式:

public class Singleton {
	public static synchronized Singleton getInstance() {
		if (null == uniquesInstance) {
			uniquesInstance = new Singleton();
		}
		return uniquesInstance;
	}
	
	private Singleton() {}
	
	private static Singleton uniquesInstance;
}


缺点:实际上只有第一次创建此对象时才需要进行线程同步,对象创建后同步就没有了意义。


2.加载时创建

public class Singleton {
	public static  Singleton getInstance() {
		return uniquesInstance;
	}
	
	private Singleton() {}
	
	private static Singleton uniquesInstance = new Singleton();
}
JVM在加载这个类时马上创建一个唯一的实例,JVM保证在任何线程访问uniqueInstance静态变量之前一定先创建此实例。


3.双重检查加锁的方式

public class Singleton {
	public static  Singleton getInstance() {
		if (null == uniquesInstance) {
			synchronized (this) {
				if (null == uniquesInstance) {
					uniquesInstance = new Singleton();
				}
			}
		}
		return uniquesInstance;
	}
	
	private Singleton() {}
	
	private volatile static Singleton uniquesInstance;
}

如果实例没有创建才进行同步,而不是第一种方式的每次都同步,此方式只需要同步一次。双重检查加锁适用于JAVA5及以上的版本

你可能感兴趣的:(HeadFirst design pattern笔记-单例模式)