Volatile

请滑走,自用,无营养警告⚠

特性 ,作用:保证可见性和顺序性。

每个线程有自己私有的工作内存对变量进行操作时,会从公有的主内存拷贝变量副本到工作内存,如果对声明了volatile的变量进行写操作,虚拟机就会向处理器发送一条lock前缀的指令,将新的数据写回到系统内存,并且使其它CPU中这个变量的缓存行无效。其他cpu再读这个变量时,发现自己的缓存失效了,就会从主内存读。修改后立即写入主内存,读取时立即从主内存读,保证缓存一致性。(相同数据,不同缓存中呈现着不同的表现

 

总线嗅探通过嗅探在总线上传播的数据检查自己缓存值是否过期。?总线风暴:v的MESI缓存一致性协议,不断从主内存嗅探和CAS循环,无效的交互会占总线带宽。、

 

2.CAS

 

从引出下面的问题

AtomicInteger->CAS ->调用UnSafe类中的CAS方法直接操作内存 ->自旋: CAS思想 -> ABA

atomicInteger.getAndIncrement(){return unsafe.getAndInt(this,valueoffset,1)

AtomicInteger的value是volatile修饰的

缺:循环时间长,开销大/只能保证一个共享变量的原子操作/ABA

ABA解决:1.AtomicStampedReference修改版本号,时间戳 2.LongAdder

 

【i++】命令,拆分成3个指令*从主内存拿原始值* 进行加1操作 *写回主内存

解决1. synchronized重量级的同步机制JUC下原子包装类,AtomicInteger new
 atomicInteger.getAndIncrement();

为了提高性能,编译器和处理器,对指令重排依赖性,确保最终执行结果一致, 多线程环境中没有办法保证。

指令重排

内存屏障,是CPU指令,四个内存屏障,loadload(读前)、loadstore(读后)、storestore、storeload

单例1.getInstance()方法加synchronized关键字

2: DCL,不加volatile不安全 指令重排,  访问instance不为null时 未必已初始化完成

 

volatile适用场景

1.作为状态标志 :用于指示发生了一个重要的一次性事件,例如完成初始化或请求停机。

2.一次性安全发布:在缺乏同步的情况下,可能会遇到某个对象引用的更新值(由另一个线程写入)和该对象状态的旧值同时存在。

这就是造成著名的双重检查锁定DCL问题的根源,对象引用在没有同步的情况下进行读操作,可能会看到一个更新的引用,但是仍然会通过该引用看到不完全构造的对象。

3.独立观察 :定期 “发布” 观察结果供程序内部使用

4.volatile bean模式 :

5.开销较低的读写锁策略

 

你可能感兴趣的:(面试)