CAS无锁自旋和同步锁线程切换使用场景对比

本文对比分析了CAS(Compare and Swap)与同步锁在不同线程竞争情况下的性能表现。指出在资源竞争较少时,CAS因无需内核切换和线程阻塞,性能优于锁;但在资源竞争严重时,CAS的自旋机制会大幅降低性能,此时锁的性能更佳。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、对于资源竞争较少的情况,使用同步锁进行线程阻塞和唤醒切换以及用户态内核态间的切换操作额外浪费消耗CPU资源;而CAS基于硬件实现,不需要进入内核,不需要切换线程,操作自旋几率较少,因此可以获得更高的性能。
2、对于资源竞争严重的情况,CAS自旋的概率会比较大,从而浪费更多的CPU资源,效率低于锁。CAS在判断两次读取的值不一样的时候会放弃操作,但为了保证结果正确,通常都会继续尝试循环再次发起CAS操作,如Jdk1.6版本的AtomicInteger类的getAndIncrement()方法,就是利用了自旋实现多次尝试:

public final int getAndIncrement() {
    for (;;) {
    int current = get();
    int next = current + 1;
    if (compareAndSet(current, next))
    return current;
    }
}

如果compareAndSet(current, next)方法成功执行,则直接返回;如果线程竞争激烈,导致compareAndSet(current, next)方法一直不能成功执行,则会一直循环等待,直到耗尽cpu分配给该线程的时间片,从而大幅降低效率。
总之:
1、使用CAS在线程冲突严重时,因为自旋会大幅降低程序性能;CAS只适合于线程冲突较少的情况使用。
2、线程冲突严重的情况下,同步锁能实现线程堵塞和唤醒切换,不会出现自旋,避免了上述的情况,从而让性能远高于CAS。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值