题外话:之前一直在看大话设计模式,当时看的很明白,但是一直没有试着写。所以导致记忆不是很深刻,所以现在一边重新学习,一边试着敲一边代码,当然也参考了一些大神的代码,这里一一谢过。
单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,
任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)
以下是线程安全的双重检测单例模式写法
/**
*
*/
package org.designpatterns.singleton;
/**
* @author stone
* @version [版本号, 2015-12-21]
* <java设计模式之单例模式>
* @return 单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,
任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)
*/
public class Singleton {
private static volatile Singleton singleton = null;
//一个空的私有的构造函数
private Singleton() {
}
public static Singleton getSingletoClass(){
if(singleton == null){ //A
synchronized (Singleton.class) {//B
if(singleton == null){ //C
singleton = new Singleton();//D
}
}
}
return singleton;
}
public static void main(String[] args)
{
Singleton singletonOne =
Singleton.getSingletoClass();
Singleton singletonTwo =
Singleton.getSingletoClass();
if (singletonOne.equals(singletonTwo))
{
System.out.println("singletonOne 和 singletonTwo 代表的是同一个实例");
}
else
{
System.out.println("singletonOne 和 singletonTwo 代表的是不同一个实例");
}
}
}
分析:
1.当线程1进入A位置时,检查singleton是否为null,此时为空。
2.正好此时线程2也进入A位置,且线程切换到线程2执行,同样检查singleton为null,于是往下执行但B位置时,此时由于是synchronized的所以只能有一个线程进行操作,并且在C位置判断为null,于是实例化了该对象(D位置)。
3.现在线程切换到线程1运行线程1进入B位置,此时也只能有线程1进行操作,进入C位置判断时,由于线程的时候已经实例化了该对象所以线程1在这里不满足条件。