java.util.concurrent包中借助CAS实现锁,它与synchronized 的区别是什么?

答案

CAS 即 Compare and Swap,另外,多个线程间共享的数据称为临界资源Critical Resource

CAS就是乐观锁在java中的实现,比如多个线程要对一个临界资源执行+1操作:

while(true) { // 需要不断尝试
  int 旧值 = ...; // 比如说第一轮拿到了1
  int 结果 = 旧值 + 1; // 对我当前线程来说,结果是2 
  /* 
    比较临界资源的值还是不是1.
    这时候如果别的线程把它改了,那么 compareAndSet 返回false,进入下一轮比较(否则我的修改会覆盖别人的)
    如果别的线程还没有修改它,这时候就用当前线程的结果修改掉临界资源,并返回true 
  */
  if(compareAndSet(临界资源,结果)) { 
    // 成功,退出循环
  }
}

这里compareAndSet是这里的关键,现代的CPU指令集中都支持CAS相关指令,在java中已经做好了底层封装。java.util.concurrent包中的很多类都是利用了compareAndSet方法解决并发冲突问题。

CAS是基于乐观锁的思想:最乐观的估计,没有其它线程来修改临界资源,其它线程改了也没关系,我吃亏点再重试呗。底层是基于CPU的无阻塞算法nonblocking algorithms

synchronized是基于悲观锁的思想:最悲观的估计,得防着其它线程来修改临界资源,我上了锁你们都别想改,我改完了解开锁,你们才有机会。


results matching ""

    No results matching ""