美文网首页
并发与高并发课程学习笔记(3)

并发与高并发课程学习笔记(3)

作者: Ukuleler | 来源:发表于2018-04-20 14:09 被阅读0次

    单例模式是设计模式中常用的一种模式

    在多线程中,单例模式需要保证发布对象的唯一性,因此有三种方案来保证安全发布对象

    1.懒汉模式,

        在双重同步锁下获取实例,来保证对象唯一,但是因为jvm指令重排,所以是不能保证对象唯一的

            @NotThreadSafe

    public class SingletonExample4 {

    private SingletonExample4(){}

    private static SingletonExample4instance =null;

    //1.memory = allocate() 分配对象内存空间

        //2.ctorinstance()  初始化对象

        //3.instance = memory 设置instance指向刚分配的内存

        //jvm和cpu优化,发生指令重排

        //1.memory = allocate() 分配对象内存空间

        //3.instance = memory 设置instance指向刚分配的内存

        //2.ctorinstance()  初始化对象

        //静态的工厂方法,

        public static synchronized SingletonExample4 getInstance(){

    if(instance ==null){//双重检测

                synchronized(SingletonExample4.class){//同步锁

                    if(instance ==null){

    instance =new SingletonExample4();

    }

    }

    }

    return instance;

    }

    }

        因此,需要加入volatile关键字,来保证jvm不会发生指令重排

        private volatile static SingletonExample5instance =null;

    2.饿汉模式

    饿汉模式通常能够保证对象唯一,但是需要考虑对象的使用频率,如果使用频率不高,则不推荐,浪费性能

    @ThreadSafe

    public class SingletonExample6 {

    private SingletonExample6(){}

    private static SingletonExample6instance =null;

    static {

    instance =new SingletonExample6();

    }

    //静态的工厂方法,

        public static synchronized SingletonExample6 getInstance(){

    return instance;

    }

    public static void main(String[] args) {

    System.out.println(getInstance().hashCode());

    System.out.println(getInstance().hashCode());

    }

    }

    3.枚举模式

    通过内部枚举类来保证jvm只会初始化一次

    @ThreadSafe

    public class SingletonExample7 {

    private SingletonExample7(){

    }

    public static SingletonExample7 getInstance(){

    return Singleton.INSTANCE.getSingleton();

    }

    private enum Singleton{

    INSTANCE;

    private SingletonExample7singleton;

    //JVM保证这个方法只被调用一次

            Singleton(){

    singleton =new SingletonExample7();

    }

    public SingletonExample7 getSingleton() {

    return singleton;

    }

    }

    }

    相关文章

      网友评论

          本文标题:并发与高并发课程学习笔记(3)

          本文链接:https://www.haomeiwen.com/subject/ozbakftx.html