HelloCoder HelloCoder
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
随笔
关于作者
首页
《Java小白求职之路》
《小白学Java》
计算机毕设
  • 一些免费计算机资源
  • 脚手架工具
  • 《从0到1学习Java多线程》
  • 《从0到1搭建服务器》
  • 《可观测和监控》
随笔
关于作者
  • 《LearnJavaToFindAJob》

    • 导读

    • 【初级】6~12k档

    • 【中级】12k-26k档

      • JVM进阶

      • Java进阶

        • ConcurrentHashMap面试题
        • CopyOnWriteArrayList的实现原理
        • HashMap的put过程是怎么样的?
        • IO模型有哪些?
        • Synchronized相关
        • ThreadLocal的原理
        • synchronized锁升级
        • valueOf、(String)强转有什么区别?
        • 为什么在lambda中使用的局部变量必须是final或有效final
        • 你知道如何更新缓存吗?如何保证缓存和数据库双写一致性?
        • 八股文之ReentrantLock
        • 分布式事务
        • 如何保障生产端消息投递成功?
        • 如何手动触发全量回收垃圾,如何立即触发垃圾回收
        • 数据库连接池为什么要使用ThreadLocal?
        • 线程池中多余的线程是如何回收的
        • 谈谈你对AQS的理解
        • 谈谈你对CAS的理解
        • util.concurrent的理解
        • 高并发下如何保证接口的幂等性?
      • MySQL

      • 中间件

      • 算法

      • 高阶

    • 【高级】26k+档

    • 大厂面试题

    • 求职建议

    • 面经

  • LearnJavaToFindAJob
  • 【中级】12k-26k档
  • Java进阶
#Synchronized #相关
码农阿雨
2025-12-04
目录

Synchronized相关

# Synchronized 是公平锁吗?

Synchronized 天生就是非公平锁,而且无法设置为公平锁。

什么是公平锁和非公平锁?

公平锁:线程按照请求锁的顺序严格获取锁。如果队列中有线程在等待,新来的线程必须排队。

非公平锁:允许新来的线程(插队者)在锁被释放时,直接尝试获取锁,而不管等待队列中是否已经有线程在等待。

如何理解它是非公平的?

我们需要了解一下Synchronized 的工作原理:

synchronized 在 JVM 层面基于 Monitor(管程) 实现。当线程进入一个 synchronized 块时,它会尝试获取对象 Monitor 的所有权。

JVM 会申请一个操作系统层面的 互斥量(Mutex Lock),也称为监视器锁(Monitor)。

当锁被释放时,所有在 Contention Set(竞争集)或 Entry Set(进入集)中等待的线程都会被唤醒(或通知),然后它们会竞争重新进入 Monitor 的权利。

synchronized 无法保证等待线程的获取顺序,没有像 ReentrantLock 的 CLH 队列。 只能依赖 OS 调度(随机性)。

那么 新线程可以直接尝试竞争,它通常会比那些刚被唤醒的、需要经历上下文切换的线程更快一步获取到锁。这就是典型的插队行为。

阅读全文
×

(为防止恶意爬虫)
扫码或搜索:HelloCoder
发送:290992
即可永久解锁本站全部文章

解锁
#Synchronized#相关
上次更新: 2025-12-04 03:34:09
最近更新
01
MySQL支持的锁有哪些
12-04
02
synchronized锁升级
12-04
03
如何停止一个运行的线程
12-04
更多文章>
Theme by Vdoing | Copyright © 2020-2025 码农阿雨
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式