- 全名是Compare and swap ,有三个值,一个内存值,即将更新的值,待更新的旧值。如果旧值与内存值相等的话,才会吧内存值更新的为新值。如果不相等的话,就会进行自旋操作,不断尝试。循环的次数默认为10次。
- 使用三个线程将count 从0 增加到1000,一般可以使用synchronized保持线程对资源的互斥访问,但是效率比较低下,可以使用AtomicInteger实现,但是底层使用的cas和volatile来实现。AtomicInteger类中有Unsafe类,AtomicInteger的中getandIncrement()方法调用的Unsafe中的getAndAddInt()方法。成功的话会返回,不成功的话,会进行自旋操作。Unsafe类底层使用的操作系统的cmpxchg指令,如果是arm架构的话,底层使用的LL/LC指令。这样的话就不用操作系统的原语(mutex),cpu原生支持了cas。
- volatile关键字实现了可见性和防止指令重排,底层主要内存屏障。可见性是告诉JVM,这个变量被使用的时候,直接在共享内存上读取,一旦被改变,其他的线程的就会立马知道。也同时说明了这个变量是不稳定的。
- volatile的可见性底层是内存屏障,是一个cpu指令。volatile的另一个作用是防止指令重排。
- 创建一个新的对象分三个步骤
- 1、创建一个引用
- 2、分配内存空间
- 3、将引用指向内存空间
- 在cpu执行语句的时候,可能步骤1和步骤3执行完毕,存在多线程的情况下,此时进行对引用判断是否为空,则此时引用为空,产生了错误,这就是指令重排。
posted @
2022-03-13 09:09
牵魂
阅读(
62)
评论()
收藏
举报