Java之锁(持续更新)

本文详细介绍了Java中的锁机制,包括Synchronized的基础知识、JVM底层实现、锁升级,以及ReentrantLock的工作原理、与synchronized的区别。文中还探讨了其他类型的锁如CountDownLatch和CyclicBarrier,并提到了Redisson实现的分布式锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

java锁一般配合多线程进行使用,需要了解多线程的可点击下面链接
多线程技术

Synchronize

Synchronize基础知识

对于普通方法的同步,锁是当前实例对象。
对于静态方法的同步,锁是当前类的Class对象。
对于同步方法块,锁是Synchronized括号里配置的对象。

非公平锁、锁升级、可重入锁、JVM级别且隐式获得释放锁。
同步阻塞,使用的是悲观并发策略。

Synchronized 在jvm的底层实现

1、锁竞争候选者(OnDeck),并发情况下,
大部分线程都处在ContentionList ,JVM 会将一部分线程移动到 EntryList 中作为候选竞争线程。
2、Owner 线程会在 unlock 时,将 ContentionList 中的部分线程迁移到 EntryList 中,并指定EntryList 中的某个线程为 OnDeck 线程。
3、Owner 线程并不直接把锁传递给 OnDeck 线程,而是把锁竞争的权利交给 OnDeck,
OnDeck 需要重新竞争锁
4、OnDeck 线程获取到锁资源后会变为 Owner 线程,而没有得到锁资源的仍然停留在 EntryList中。如果 Owner 线程被 wait 方法阻塞,则转移到 WaitSet 队列中,直到某个时刻通过 notify或者 notifyAll 唤醒,会重新进去 EntryList 中。
5、处于 ContentionList、EntryList、WaitSet 中的线程都处于阻塞状态。
6、Synchronized 是非公平锁。 Synchronized 在线程进入 ContentionList 时,等待的线程会先尝试自旋获取锁,如果获取不到就进入 ContentionList,这明显对于已经进入队列的线程是不公平的,还有一个不公平的事情就是自旋获取锁的线程还可能直接抢占 OnDeck 线程的锁资源。

Synchronized 核心组件
1.Wait Set:哪些调用 wait 方法被阻塞的线程被放置在这里;
2.Contention List:竞争队列,所有请求锁的线程首先被放在这个竞争队列中;
3.Entry List:Contention List 中那些有资格成为候选资源的线程被移动到 Entry List 中;
4.OnDeck:任意时刻,最多只有一个线程正在竞争锁资源,该线程被成为 OnDeck;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值