您的位置:首页 > 编程语言 > Java开发

Java设计模式之单例模式

2015-12-24 16:02 344 查看
题外话:之前一直在看大话设计模式,当时看的很明白,但是一直没有试着写。所以导致记忆不是很深刻,所以现在一边重新学习,一边试着敲一边代码,当然也参考了一些大神的代码,这里一一谢过。

单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,

       任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)

以下是线程安全的双重检测单例模式写法

/**
*
*/
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位置时,此时由于是sync
4000
hronized的所以只能有一个线程进行操作,并且在C位置判断为null,于是实例化了该对象(D位置)。

3.现在线程切换到线程1运行线程1进入B位置,此时也只能有线程1进行操作,进入C位置判断时,由于线程的时候已经实例化了该对象所以线程1在这里不满足条件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息