并发之CAS&Atomic 原子操作

什么是原子性?
  • 相信很多同学在工作中经常使用事务,事务的一大特性就是原子性(事务具有ACID四大特性),一个事务包含多个操作,这些操作要么全部执行,要么全都不执行。
  • 并发里的原子性和原子操作是一样的内涵和概念,假定有两个操作A和B都包含多个步骤,如果从执行A的线程来看,当另一个线程执行B时,要么将B全部执行完,要么完全不执行B,执行B的线程看A的操作也是一样的,那么A和B对彼此来说是原子的。
什么是原子操作?如何实现原子操作?

实现原子操作可以使用锁, 锁机制, 满足基本的需求是没有问题的了, 但是 有的时候我们的需
求并非这么简单,我们需要更有效,更加灵活的机制。synchronized 关键字是基于阻塞的锁机制,也就是说当一个线程拥有锁的时候, 访问同一资源的其它线程需要等待,直到该线程释放锁。
这里会有些问题:

  • 首先,如果被阻塞的线程优先级很高很重要怎么办?
  • 其次, 如果获得锁的线程一直不释放锁怎么办?同时,还有可能出现一些例如死锁之类的情况
  • 最后, 其实锁机制是一种比较粗糙,粒度比较大的机制,相对于像计数器这样的需求有点儿过于笨重。为了解决这个问题,Java提供了Atomic系列的原子操作类。

这些原子操作类其实是使用当前的处理器基本都支持CAS的指令,比如Intel的汇编指令cmpxchg,每个厂家所实现的具体算法并不一样,但是原理基本一样。每一个CAS操作过程都包含三个运算符:一个内存地址V,一个期望的值A和一个新值B,操作的时候如果这个地址上存放的值等于这个期望的值A,则将地址上的值赋为新值B,否则不做任何操作
CAS的基本思路就是,如果这个地址上的值和期望的值相等,则给其赋予新值,否则不做任何操作,但是要返回原值是多少。自然CAS操作执行完成时,在业务上不一定完成了,这个时候我们就会对CAS操作进行反复重试,于是就有了循环CAS。很明显,循环CAS就是在一个循环里不断的做cas操作,直到成功为止。Java中的Atomic系列的原子操作类的实现则是利用了循环CAS 来实现。

你可能感兴趣的:(并发,java,开发语言,并发)