加入收藏 | 设为首页 | 会员中心 | 我要投稿 惠州站长网 (https://www.0752zz.com.cn/)- 办公协同、云通信、物联设备、操作系统、高性能计算!
当前位置: 首页 > 业界 > 正文

只有30%的企业准备好了

发布时间:2021-02-01 10:16:38 所属栏目:业界 来源:互联网
导读:不用Volatile则代码运行时可能存在指令重排,会导致线程一在运行时执行顺序是 1--2-- 4 就赋值给instance变量了,然后接下来再执行构造方法初始化。问题是如果构造方法初始化执行没完成前 线程二进入发现instance != null,直接给线程二个半成品,加入volati

不用Volatile则代码运行时可能存在指令重排,会导致线程一在运行时执行顺序是 1-->2--> 4 就赋值给instance变量了,然后接下来再执行构造方法初始化。问题是如果构造方法初始化执行没完成前 线程二进入发现instance != null,直接给线程二个半成品,加入volatile后底层会使用内存屏障强制按照你以为的执行。

单例模式几乎是面试必考点,,一般有如下特性:

懒汉式:在需要用到对象时才实例化对象,正确的实现方式是 Double Check + Lock + volatile,解决了并发安全和性能低下问题,对内存要求非常高,那么使用懒汉式写法。

饿汉式:在类加载时已经创建好该单例对象,在获取单例对象时直接返回对象即可,对内存要求不高使用饿汉式写法,因为简单不易出错,且没有任何并发安全和性能问题。

枚举式:Effective Java 这本书也列举了使用枚举,其代码精简,没有线程安全问题,且 Enum 类内部防止反射和反序列化时破坏单例。

7、线程池

7.1 五分钟了解线程池

老王是个深耕在帝都的一线码农,辛苦一年挣了点钱,想把钱存储到银行卡里,拿钱去银行办理遇到了如下的遭遇

老王银行门口取号后发现有柜台营业ing 但是没人办理业务就直接办理了。

老王取号后发现柜台上都有人在办理,等待席有空地,去坐着等办理去了。

老王取号后发现柜台都有人办理,等待席也人坐满了,这个时候银行经理看到老王是老实人本着关爱老实人的态度,新开一个临时窗口给他办理了。

老王取号后发现柜台都满了,等待座位席也满了,临时窗口也人满了。这个时候银行经理给出了若干解决策略。

  • 直接告知人太多不给你办理了。
  • 采用冷暴力模式,也不给不办理也不让他走。
  • 经理让老王取尝试跟座位席中最前面的人聊一聊看是否可以加塞,可以就办理,不可以还是被踢走。
  • 经理直接跟老王说谁让你来的你找谁去我这办理不了

olatile就会用到上面说到的内存屏障,目前有四种内存屏障:

  1. StoreStore屏障,保证普通写不和volatile写发生重排序
  2. StoreLoad屏障,保证volatile写与后面可能的volatile读写不发生重排序
  3. LoadLoad屏障,禁止volatile读与后面的普通读重排序
  4. LoadStore屏障,禁止volatile读和后面的普通写重排序

volatile原理:用volatile变量修饰的共享变量进行写操作的时候会使用CPU提供的Lock前缀指令,在CPU级别的功能如下:

将当前处理器缓存行的数据写回到 系统内存。

这个写回内存的操作会告知在其他CPU你们拿到的变量是无效的下一次使用时候要重新共享内存拿。

6、单例模式 DCL + volatile

6.1 标准单例模式

高频考点单例模式:就是将类的构造函数进行private化,然后只留出一个静态的Instance 函数供外部调用者调用。单例模式一般标准写法是 DCL + volatile:

 

(编辑:惠州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读