CAS 适用于写比较少的情况下(多读场景,冲突一般较少),synchronized 适用于写比较多的情况下(多写场景,冲突一般较多)。
- 对于资源竞争较少(线程冲突较轻)的情况,使用 synchronized 同步锁进行线程阻塞,唤醒切换,以及用户态内核态间的切换操作,都会额外消耗 cpu 资源;而 CAS 基于硬件实现,不需要进入内核,不需要切换线程,操作自旋几率较少,因此可以获得更高的性能
- 对于资源竞争严重(线程冲突严重)的情况,CAS 自旋的概率会比较大,从而浪费更多的 CPU 资源,效率低于 synchronized
Java 并发编程这个领域中,synchronized 关键字一直都被认为是元老级的角色,很多人都会称它为 “重量级锁”。但是,在 JavaSE1.6 之后,进行了主要包括为了减少获得锁和释放锁所带来的性能消耗,而引入了 偏向锁 和 轻量级锁 以及其它各种优化,在某些情况下,synchronized 并不是那么重了。synchronized 的底层实现,主要依靠 Lock-Free 的队列,基本思路是 自旋后阻塞,竞争切换后继续竞争锁,稍微牺牲了公平性,但获得了高吞吐量。在线程冲突较少的情况下,可以获得和 CAS 类似的性能;而线程冲突严重的情况下,性能是远高于 CAS。