原子操作
也可以理解为“锁”,锁的目的就是为了保证原子操作嘛,说白了就是某一时刻只允许一个线程操作,不允许相关的线程干扰
原子操作有2个层级可以实现:
cpu指令级别(单个指令的原子性)
方法:调用lock前缀的汇编指令
带有lock前缀的指令在执行期间会锁住总线,让其他cpu无法执行,达到原子性的目的
应用程序内部级别
synchronized:(代码块的原子性)
java中的锁不会依赖类似lock前缀的汇编指令实现的,而是通过线程间的互斥。是在jvm源码中实现的(c++编写的),大概逻辑是:
监控一个代码块的入口和出口。
第一个线程可以顺利进入执行代码
第二个,第三个线程…变成挂起状态,进入等待队列
第一个线程执行完毕,通知等待队列中的线程:你们中可以选一个区执行啦….
java.util.concurrent.locks.Lock:用java写的
和synchronized内部实现差不多,只是lock提供了更多灵活的功能:如条件锁。 但是synchronized会稍好一些
原子操作常用技术
final:提供可见性
volatile:保证能读取到最近一次修改
synchronized:保证每个时刻只有一个人操作代码,并能保证下个线程读取到最新值
concurrent包:和synchronized作用类似
cas(compare and swap)操作:对比跟新。
Cas方法
作用:原子的更新一个值
总共存在三个操作数:预期值A、内存中的V、修改的值B。当且仅当预期值A和内存中的值V相同,则将内存V值修改为B,否则返回V