在之前单例模式一文章基础上进行编写 代码如下 1.使用线程安全情况进行改造
package com.zw.design.pattern.creational.singleton.v2;
/****
* 升级的版本单例类
*/
public class LazyDoubleSingleton {
//该地方使用缓存一致性协议
//静态成员 使用volatile 进行修饰它
private volatile static LazyDoubleSingleton lazySingleton=null;
//私有化构造函数
private LazyDoubleSingleton(){
}
/****
* 改造粗略的单例模式
* @return
*/
public static LazyDoubleSingleton getInstance(){
if (lazySingleton == null) {
synchronized(LazyDoubleSingleton.class) {
if (lazySingleton == null) {
lazySingleton = new LazyDoubleSingleton();
//1.分配内存给这个对象
//3 LazyDoubleSingleton 设置指向刚才分配这个内存对象
//2 初始化这个对象
}
}
}
return lazySingleton;
}
}
2.编写线程类
package com.zw.design.pattern.creational.singleton.v2;
public class T2 implements Runnable{
@Override
public void run() {
LazyDoubleSingleton instance = LazyDoubleSingleton.getInstance();
System.out.println(Thread.currentThread().getName() + instance);
}
}
3.测试如下
package com.zw.design.pattern.creational.singleton.v2;
import com.zw.design.pattern.creational.singleton.T;
public class Test {
public static void main(String[] args) {
// LazySingleton instance = LazySingleton.getInstance();
Thread thread=new Thread(new T2());
Thread thread2=new Thread(new T2());
thread.start();
thread2.start();
System.out.println("instance = " );
}
}
4.开始内部类写法
package com.zw.design.pattern.creational.singleton.v3;
/****
* 使用静态内部类方式创建单例
*/
public class StaticInnerClassSingleton {
private static class InnerClass{
private final static StaticInnerClassSingleton singleton=new StaticInnerClassSingleton();
}
public static StaticInnerClassSingleton getInstance(){
return InnerClass.singleton;
}
private StaticInnerClassSingleton(){
}
}
5.编写 线程类
package com.zw.design.pattern.creational.singleton.v3;
import com.zw.design.pattern.creational.singleton.LazySingleton;
public class T3 implements Runnable{
@Override
public void run() {
StaticInnerClassSingleton instance = StaticInnerClassSingleton.getInstance();
System.out.println(Thread.currentThread().getName() + instance);
}
}
6.测试如下
package com.zw.design.pattern.creational.singleton.v3;
import com.zw.design.pattern.creational.singleton.T;
public class Test {
public static void main(String[] args) {
// LazySingleton instance = LazySingleton.getInstance();
Thread thread=new Thread(new T3());
Thread thread2=new Thread(new T3());
thread.start();
thread2.start();
}
}
测试结果如下
代码如下