面试题——synchronized为什么是非公平锁?

什么是非公平锁

非公平锁:新来的线程不会考虑entryList队列是否有等待线程,而是直接参与竞争锁。这就导致,线程尝试获取锁失败,进入阻塞队列的顺序和最终被唤醒的顺序是不一致的,也就是说你先进入队列,不代表你就会先被唤醒,因为有可能被新来的线程通过自旋抢到锁。

当持有锁的线程释放锁时,该线程会执行以下两个重要操作:

(1)先将锁的持有者owner 属性赋值为 null;

(2)唤醒等待链表中的一个线程(假定继承者?随机挑一个唤醒?存疑)。

在这两个步骤之间,如果有其他线程刚好在尝试获取锁(例如自旋),则可以马上获取到锁。

synchronized为什么是非公平锁/为什么各种锁实现默认用非公平锁

都用非公平策略是有原因的,比如线程1持有一把锁,这个时候线程2,3,4依次请求进来,那么他们依次排队到队列,陷入等待,也就是进入阻塞的状态,然后线程1执行完毕,本该轮到线程2苏醒获取到锁,但是这个时候恰巧线程5请求这把锁,那么根据非公平的原则,线程5就获取到锁了,这是因为唤醒线程2会有很大的开销,因为程序的执行大部分都很快,很可能在唤醒线程2之前,线程5就已经执行完毕了,所以按照非公平策略的逻辑,这里会让线程5先获取到锁,相比于等待线程2唤醒的漫长过程,直接执行线程5效率会更高,提高整体的运行效率。

对于线程5而言: 不需要任何等待直接获取到锁并执行,提高了它的效率。

对于线程2而言:它获得锁的时间并没有推迟,因为等它被唤醒的时候,线程 5 早就释放锁了,因为线程 5 的执行速度相比于线程 2 的唤醒速度,是很快的。

所以一般情况下锁的默认策略,都是非公平的策略,这是为了提高整体的运行效率

参考

【锁思想】为什么synchronized的默认策略是非公平的?_synchronized是公平锁吗-CSDN博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值