【java 为什么说 Synchronized 是非公平锁?】

概要

在Java中,synchronized 关键字用于实现同步,以确保在多线程环境下对共享资源的访问是线程安全的。然而,synchronized 实现的锁机制默认被认为是非公平锁。以下是关于 synchronized 为何是非公平锁的解释:

1. 非公平锁的定义

非公平锁是指当一个线程释放锁时,等待队列中的线程不一定按照它们等待的顺序来获取锁,而是允许其他正在等待的线程或者新来尝试获取锁的线程进行竞争。也就是说,非公平锁不保证等待时间最长的线程会优先获得锁。

2. synchronized 作为非公平锁的原因

  • 效率优先:synchronized 的设计初衷是提供线程同步的功能,而非确保严格的公平性。非公平锁允许新来的线程直接尝试获取锁,这有助于减少线程切换的开销,从而提高效率。
  • 避免饥饿现象:虽然非公平锁可能导致某些线程等待时间变长,但在实际使用中,由于线程调度的不确定性,很难出现某个线程长时间无法获取锁的情况(即饥饿现象)。

3. 非公平锁的特点

  • 性能较好:因为减少了线程切换的开销,所以非公平锁通常具有更好的性能。
  • 可能产生饥饿现象:虽然这种情况在实际中较少出现,但在某些特定场景下,如果某个线程一直竞争失败,可能会导致其长时间无法获取锁。

4. 如何实现公平锁

如果需要更严格的公平性,可以使用 ReentrantLock 类来替代 synchronized。ReentrantLock 允许通过构造函数指定是否为公平锁。当设置为公平锁时,它会按照等待队列中线程等待的顺序来分配锁。

总结

synchronized 作为Java中的内置锁机制,默认实现为非公平锁。这是基于性能考虑和避免饥饿现象的折中方案。在大多数场景下,非公平锁的性能优势足以弥补其可能带来的不公平性。然而,在需要更严格公平性的场景中,可以使用 ReentrantLock 类来实现公平锁。

synchronized为什么是非公平的呢?通过阅读引用1和引用2,我们可以得出结论。在Java中,synchronized关键字的实现有两种方式:公平公平公平会按照线程的请求顺序来获取,而公平则允许插队,即当前线程在获取时可以抢占已经等待时间很长的线程的synchronized关键字默认使用公平的原因是为了提高程序的性能。公平需要维护一个有序的等待队列,这会增加系统的开销。而公平则不需要维护等待队列的顺序,所以相对更加高效。此外,公平还可以减少线程切换的次数,从而提高程序的执行效率。 需要注意的是,公平并不代表绝对的公平性,也不是完全按照请求的顺序获取。即使是公平,当一个线程释放时,下一个获取的线程也不一定是等待时间最长的线程,因为存在一些运行时的优化机制,比如线程的优先级等。 综上所述,synchronized是非公平的主要是出于性能方面的考虑,公平的机制能够更高效地处理的竞争,并减少线程切换的次数。在实际应用中,我们需要根据具体情况来选择合适的模式。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【思想】为什么synchronized的默认策略是非公平?](https://blog.youkuaiyun.com/m0_73311735/article/details/131304965)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [为什么Synchronized 是非公平?](https://blog.youkuaiyun.com/m0_71777195/article/details/131241525)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值