美文网首页
DCL机制下的隐患?

DCL机制下的隐患?

作者: 发疯的2魅 | 来源:发表于2023-06-06 10:54 被阅读0次

dcl : double check lock 双重检查锁机制

       脱胎于单例模式,饿汉式单例模式 

        饿汉式单例模式

        class  RetrofitUrl {

                fun getInstance():RetrofitUrl {

                            if (retrofitService == null) {

                                    synchronized(RetrofitUrl::class.java){

                                           val interceptor = HttpLoggingInterceptor()

                                           interceptor.level = HttpLoggingInterceptor.Level.BODY

                                           val client = OkHttpClient.Builder()

                                           .connectTimeout(60,TimeUnit.SECONDS)

                                           .readTimeout(60,TimeUnit.SECONDS)

                                            .writeTimeout(60,TimeUnit.SECONDS)

                                             .addInterceptor(interceptor)

                                              .retryOnConnectionFailure(true)

                                               .build()

                                    val retrofit = Retrofit.Builder()//设置数据解析器

                                            .addConverterFactory(GsonConverterFactory.create())

                                            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())

                                            .client(client)//设置网络请求的Url地址

                                            .baseUrl(getBase())

                                            .build()// 创建网络请求接口的实例

                                            retrofitService = retrofit.create(RetrofitUrl::class.java)

                        }

                }

                        return retrofitService!!

                    }

        }

   传统单例模式 在上版本基础上去掉了  synchronized(RetrofitUrl::class.java) 锁,旨在解决单线程情况下单一实例问题,多线程访问会导致

    创建多个实例问题。

    多线程每个线程拥有一块内存,此内存对该线程开放,其他线程无法访问其中变量 (volatile修饰除外<此关键字修饰内容会主动把线程内变量同步到主内存,也就是全部线程可访问>)  ,而加入锁之后会同步所有线程。

   但上述模式在某些特殊情况下会发生错误,根源在于cpu 指令重排序

          因为上述中创建对象  例如  sigton = new  sington() 这个操作不是原子性的,发生是需要几个步骤和过程

           其中分为三步

            1. 给创建的对象分配内存空间

             2. 初始化创建的对象

             3. 将内存地址指针赋予生成的对象 

            按照上述步骤依次完成生成的对象此时不再为空,引用可进行调用

            而特殊情况就发生在2和3 的步骤上,发生重排序后,若顺序变为 1-3-2,多线程访问有可能2没有完成,也就是此时对象不为null 但此时对象没有完全完成初始化,此时进行使用发生一些不可估的错误。

   

相关文章

  • 几种单例模式的思考

    DCL(Double Check Lock,双重检查锁)机制 public class Singleton {pr...

  • 摘要

    监狱安全管理的机制,由领导责任机制,安全防控机制,隐患排除机制,应急处置机制,狱情搜集机制组成。领导责任机制,坚持...

  • DCL单例模式

    DCL(Double Check Lock双端检锁机制)单例模式:适用于多线程高并发场景

  • MySQL基础——DCL语句

    上篇文章学习了MySQL基础——DQL语句,这篇文章学习MySQL基础——DCL语句。 DCL语句 DCL英文全称...

  • 数据库基本操作3.0

    今日内容 多表查询 \\ 事务DCL 多表查询: 事务 DCL:

  • 并发 - volatile(二)

    问题是最好的导师, 细心是最棒的品质 DCL一定要加volatile吗? 一、DCL DCL全称double ch...

  • “斑”下的隐患

    嗨!亲爱的们大家好!今天咱们聊聊关于健康的话题!我们什么有没有长斑的人呢?尤其是老年人出现的,有是吧,我们...

  • 高温下的隐患

    昨天新闻报道了这样一件事情,8月25日,在某市,有一辆白色的私车,在一个十字路口处,突然停下,车上冲下来两...

  • 单例模式

    Double Check Lock(DCL) (不推荐) DCL失效问题sSingleton = new DCLS...

  • 4.MySQL多表&事务

    主要内容 1 . 多表查询2 . 事务3 . DCL 多表查询: 事务 DCL:

网友评论

      本文标题:DCL机制下的隐患?

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