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

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

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

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;

}

}

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,372评论 11 349
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,973评论 19 139
  • 前言 本文主要参考 那些年,我们一起写过的“单例模式”。 何为单例模式? 顾名思义,单例模式就是保证一个类仅有一个...
    tandeneck阅读 2,539评论 1 8
  • “推敲”一词的由来 唐朝有个诗人名叫贾岛,有一年他到长安赶考。 一次,他外出归...
    致远作文阅读 251评论 0 0