Synchronized是非公平锁的原因

举报
赵KK日常技术记录 发表于 2023/06/30 22:51:07 2023/06/30
【摘要】 Synchronized是非公平锁的原因 概述在并发编程中,锁是保证线程安全和数据一致性的关键技术之一。为了实现对共享资源的互斥访问,Java提供了Synchronized关键字来定义临界区,即同一时间只能有一个线程执行该临界区内的代码块。然而,Synchronized锁有两种不同的实现方式:公平锁和非公平锁。本文将重点讨论Synchronized为什么被认为是非公平锁的原因。 公平锁与非...

Synchronized是非公平锁的原因

概述

在并发编程中,锁是保证线程安全和数据一致性的关键技术之一。为了实现对共享资源的互斥访问,Java提供了Synchronized关键字来定义临界区,即同一时间只能有一个线程执行该临界区内的代码块。然而,Synchronized锁有两种不同的实现方式:公平锁和非公平锁。本文将重点讨论Synchronized为什么被认为是非公平锁的原因。

公平锁与非公平锁

在并发编程中,公平锁和非公平锁是对锁的获取顺序进行规定的。公平锁会按照线程的请求顺序来分配锁,即先到先得的原则。而非公平锁则允许线程插队,不保证锁的获取顺序与线程请求的顺序一致。

Synchronized的实现机制

Synchronized在Java中是基于互斥锁的实现方式。当一个线程想要执行Synchronized修饰的代码块时,它首先要去申请这个代码块的锁。在Synchronized的实现中,锁的获取是通过监视器对象来实现的,每个对象都有一个与之相关联的监视器对象,用来控制对该对象的访问。

Synchronized是非公平锁的原因

Synchronized被认为是非公平锁的主要原因在于它在锁的获取上存在以下特点:

1. 唤醒机制
当一个线程释放锁时,JVM会使用某种调度算法从等待队列中选择一个线程获得锁。在Synchronized的实现中,被唤醒的线程不是按照请求顺序来获取锁,而是通过竞争机制来决定。这就导致了后来请求锁的线程有可能插队成功,即使先前已有线程在等待锁。

2. 阻塞机制
Synchronized在申请锁时,如果发现锁已被其他线程持有,申请线程会进入阻塞状态,等待锁的释放。而当锁释放后,JVM会随机选择一个等待的线程来获取锁。这种随机选择的机制,使得排在后面的线程有机会插队获取锁,而不再遵循先到先得的公平原则。

综上所述,Synchronized的唤醒机制和阻塞机制都不保证锁的获取顺序与线程的请求顺序一致,即Synchronized是非公平锁。这也意味着在高并发的情况下,某些线程可能会饥饿,长时间得不到锁资源,从而影响系统的性能和公平性。

非公平锁的优缺点

非公平锁的主要优点在于它可以提高系统的吞吐量。由于允许线程插队成功获取锁,后续请求锁的线程可以尽快获得资源,减少了等待时间,提高了系统的性能。

然而,非公平锁也存在缺点。首先,它会导致一些线程饥饿,长时间得不到锁资源;其次,它可能会导致线程的不公平竞争,既老的线程可以不断地插队获取锁,而新的线程得不到公平竞争的机会。

总结

Synchronized因其锁的获取机制而被认为是非公平锁。由于唤

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。