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

Posted doudoutj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第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)的主要内容,如果未能解决你的问题,请参考以下文章

第280天学习打卡(知识点回顾 volatile和synchronized的区别)

第223天学习打卡(知识点回顾 volatile JMM)

第254天学习打卡(知识点回顾 spring事务操作)

第283天学习打卡(知识点回顾 SQL优化的一般步骤)

第252天学习打卡(知识点回顾 AOP操作)

第254天学习打卡(知识点回顾 spring事务操作)