原子操作

也可以理解为“锁”,锁的目的就是为了保证原子操作嘛,说白了就是某一时刻只允许一个线程操作,不允许相关的线程干扰

原子操作有2个层级可以实现:

  1. cpu指令级别(单个指令的原子性)
    1. 方法:调用lock前缀的汇编指令
      1. 带有lock前缀的指令在执行期间会锁住总线,让其他cpu无法执行,达到原子性的目的
  2. 应用程序内部级别
    1. synchronized:(代码块的原子性)
      1. java中的锁不会依赖类似lock前缀的汇编指令实现的,而是通过线程间的互斥。是在jvm源码中实现的(c++编写的),大概逻辑是:
        1. 监控一个代码块的入口和出口。
        2. 第一个线程可以顺利进入执行代码
        3. 第二个,第三个线程…变成挂起状态,进入等待队列
        4. 第一个线程执行完毕,通知等待队列中的线程:你们中可以选一个区执行啦….
    2. java.util.concurrent.locks.Lock:用java写的
      1. 和synchronized内部实现差不多,只是lock提供了更多灵活的功能:如条件锁。 但是synchronized会稍好一些

原子操作常用技术

Cas方法

作用:原子的更新一个值 总共存在三个操作数:预期值A、内存中的V、修改的值B。当且仅当预期值A和内存中的值V相同,则将内存V值修改为B,否则返回V