第234天学习打卡(知识点回顾volatile 2 CAS)

知识点回顾

线程安全性获得保证

工作内存与主内存同步延迟现象导的可见性问题,可以使用synchronized或volatile关键字解决,它们都可以使一个线程修改后的变量立即对其他线程可见。

对于指令重排导致的可见性问题和有序性问题:可以利用volatile关键字解决,因为volatile的另外一个作用就是禁止重排序优化。

指令重排只会保证串行语义的执行的一致性(单线程),但并不会关心多线程间的语义一致性。所以当一条线程访问instance不为null时,由于instance实例未必已初始化完成,也就造成了线程安全问题。

CAS(compareAndSwap):比较并交换

CAS它是一条CPU原语。它的功能是判断内存某个位置的值是否为预期值,如果是则更改新的值,这个过程是原子的。CAS并发原语体现在Java语言就是sun.misc.Unsafe类中的各个方法。调用UnSafe类中的CAS方法,JVM会帮我们实现出CAS汇编指令。这是一种完全依赖于硬件的功能,通过它实现了原子操作。注意的是,由于CAS是一种系统原语,原语属于操作系统用语范畴,是由若干条指令组成的,用于完成某个功能的过程,并且原语的执行必须是连续的,在执行过程中不允许被中断,也就是说CAS是一条CPU的原子指令,不会造成所谓数据不一致问题。

Unsafe:

是CAS的核心类,由于Java方法无法直接访问底层系统,需要通过本地(native)方法来访问,Unsafe相当于一个后门,基于该类可以直接操作特定内存的数据。Unsafe类存在于sun.misc包中,其内部操作可以向C的指针一样直接操作内存,因为Java中CAS操作的执行依赖于Unsafe类的方法。

注意Usafe类中的所有方法都是native修饰的,也就是说Unsafe类中的方法都直接调用操作系统底层资源执行相应任务。

B站尚硅谷Java大厂面试题第二季(java面试必学,周阳主讲)哔哩哔哩bilibili

第234天学习打卡(知识点回顾volatile 2 CAS)

上一篇:arcgis属性对比


下一篇:Photoshop为草地上的美女调制明快的秋季蓝黄色