- 对于资源竞争较少的情况,使用Aynchronized同步锁进行线程阻塞和唤醒以及内核的切换操作会额外消耗CPU,而CAS基于硬件实现,不需要进入内核,不需要切换线程,操作自旋几率较少,可以获得更好的性能
- 对于资源竞争严重的情况,CAS自旋的概率会比较大,从而浪费更多的CPU资源
比如AtomicInteger的getAndIncrement()操作
public final int getAndIncrement() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next)) {
return next
}
}
}
如果compareAndSet()方法陈宫执行,则直接返回;如果线程之间竞争激烈,导致compareAndSet()一直不成功,则会一直循环等待,直到好近cpu分配给该线程的时间片,从而大幅度降低效率
- 总结
- 使用CAS在线程冲突严重的情况下,会大幅降低程序性能,CAS只适用于线程冲突较少的情况下使用
- synchronized在jdk1.6之后,依靠Lock-Free,基本思路是自旋后阻塞,在线程冲突较少的情况下,可以获得和CAS类似的性能,而线程冲突严重的情况下,性能远高于CAS
网友评论