无锁和偏向锁有什么区别?

无锁和偏向锁是 Java 中的两种轻量级锁实现,它们和重量级锁相比,具有更高的性能和更低的开销。它们之间的区别如下:

  1. 无锁(CAS 自旋锁):无锁是一种不需要使用锁的同步技术,它的实现依赖于 CAS (Compare And Swap) 操作,通过不断的 CAS 操作来尝试更新共享变量的值,直到更新成功。如果同时有多个线程进行 CAS 操作,只有一个线程能成功更新共享变量,其他线程需要重新尝试。因此,无锁适用于高并发下访问量较小的场景,它可以减少锁竞争所带来的开销,提高程序的并发性能。

  2. 偏向锁:偏向锁是一种针对单线程的锁优化,当一个线程获取锁后,会在锁对象的对象头中记录这个线程的 ID,下次这个线程再次获取锁时,无需重新竞争,直接进入临界区。只有当其他线程竞争同一个锁时,偏向锁才会升级为轻量级锁或重量级锁。偏向锁适用于对象被大多数时间都是由同一个线程访问的场景,能够减少多线程竞争所带来的开销,提高程序的运行效率。

    偏向锁在资源⽆竞争情况下消除了同步语句,连CAS操作都不做了,提⾼了程序的运⾏性能。(⼤⽩话就是对锁置个变量,如果发现为true,代表资源⽆竞争,则⽆需再⾛各种加锁/解锁流程。如果为false,代表存在其他线程竞争资源,那么就会⾛后⾯的流程)

总之,无锁适用于访问量较小,但是需要高并发的场景,而偏向锁则适用于单线程或者少量线程访问同一个对象的场景。在具体应用中,我们可以根据场景需求选择适合的锁实现。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值