只有30%的企业准备好了
不用Volatile则代码运行时可能存在指令重排,会导致线程一在运行时执行顺序是 1-->2--> 4 就赋值给instance变量了,然后接下来再执行构造方法初始化。问题是如果构造方法初始化执行没完成前 线程二进入发现instance != null,直接给线程二个半成品,加入volatile后底层会使用内存屏障强制按照你以为的执行。 单例模式几乎是面试必考点,,一般有如下特性: 懒汉式:在需要用到对象时才实例化对象,正确的实现方式是 Double Check + Lock + volatile,解决了并发安全和性能低下问题,对内存要求非常高,那么使用懒汉式写法。 饿汉式:在类加载时已经创建好该单例对象,在获取单例对象时直接返回对象即可,对内存要求不高使用饿汉式写法,因为简单不易出错,且没有任何并发安全和性能问题。 枚举式:Effective Java 这本书也列举了使用枚举,其代码精简,没有线程安全问题,且 Enum 类内部防止反射和反序列化时破坏单例。 7、线程池 7.1 五分钟了解线程池 老王是个深耕在帝都的一线码农,辛苦一年挣了点钱,想把钱存储到银行卡里,拿钱去银行办理遇到了如下的遭遇 老王银行门口取号后发现有柜台营业ing 但是没人办理业务就直接办理了。 老王取号后发现柜台上都有人在办理,等待席有空地,去坐着等办理去了。 老王取号后发现柜台都有人办理,等待席也人坐满了,这个时候银行经理看到老王是老实人本着关爱老实人的态度,新开一个临时窗口给他办理了。 老王取号后发现柜台都满了,等待座位席也满了,临时窗口也人满了。这个时候银行经理给出了若干解决策略。
olatile就会用到上面说到的内存屏障,目前有四种内存屏障:
volatile原理:用volatile变量修饰的共享变量进行写操作的时候会使用CPU提供的Lock前缀指令,在CPU级别的功能如下: 将当前处理器缓存行的数据写回到 系统内存。 这个写回内存的操作会告知在其他CPU你们拿到的变量是无效的下一次使用时候要重新共享内存拿。 6、单例模式 DCL + volatile 6.1 标准单例模式
高频考点单例模式:就是将类的构造函数进行private化,然后只留出一个静态的Instance 函数供外部调用者调用。单例模式一般标准写法是 DCL + volatile: (编辑:惠州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |