单例模式(二)懒汉式之多线程与内部类

83 阅读1分钟

在之前单例模式一文章基础上进行编写 代码如下 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();
    }
}

测试结果如下 测试结果 代码如下