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在这里不满足条件。
单例模式(也叫单件模式)的作用就是保证在整个应用程序的生命周期中,
任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)
以下是线程安全的双重检测单例模式写法
/**
*
*/
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在这里不满足条件。
相关文章推荐
- php设计模式之单例模式实例分析
- JavaScript编程的单例设计模讲解
- C#设计模式之单例模式实例讲解
- JS模式之单例模式基本用法
- 深入理解JavaScript系列(25):设计模式之单例模式详解
- Java单例模式、饥饿模式代码实例
- Android源码学习之单例模式应用及优点介绍
- C++设计模式之单例模式
- C#窗口实现单例模式的方法
- Java线程安全中的单例模式
- PHP单例模式详细介绍
- PHP 面向对象程序设计(oop)学习笔记(三) - 单例模式和工厂模式
- php实现singleton()单例模式实例
- PHP中数据库单例模式的实现代码分享
- php利用单例模式实现日志处理类库
- 浅析php单例模式
- php单例模式实现方法分析
- javascript单例模式的简单实现方法
- js单例模式的两种方案
- php单例模式示例分享