千家信息网

Java中的可重入锁详解

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容主要讲解"Java中的可重入锁详解",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java中的可重入锁详解"吧!本文里面讲的是广义上的可重入锁,而不
千家信息网最后更新 2026年11月01日Java中的可重入锁详解

本篇内容主要讲解"Java中的可重入锁详解",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Java中的可重入锁详解"吧!

本文里面讲的是广义上的可重入锁,而不是单指JAVA下的ReentrantLock。

可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。

在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁。

下面是使用实例:

package reentrantLock; public class Test implements Runnable{ public synchronized void get(){ System.out.println(Thread.currentThread().getId()); set(); } public synchronized void set(){ System.out.println(Thread.currentThread().getId()); } @Override public void run() { get(); } public static void main(String[] args) { Test ss=new Test(); new Thread(ss).start(); new Thread(ss).start(); new Thread(ss).start(); }}

package reentrantLock; import java.util.concurrent.locks.ReentrantLock; public class Test implements Runnable { ReentrantLock lock = new ReentrantLock(); public void get() { lock.lock(); System.out.println(Thread.currentThread().getId()); set(); lock.unlock(); } public void set() { lock.lock(); System.out.println(Thread.currentThread().getId()); lock.unlock(); } @Override public void run() { get(); } public static void main(String[] args) { Test ss = new Test(); new Thread(ss).start(); new Thread(ss).start(); new Thread(ss).start(); }}

可重入锁最大的作用是避免死锁

我们以自旋锁作为例子,

public class SpinLock {private AtomicReference owner =new AtomicReference<>();public void lock(){Thread current = Thread.currentThread();while(!owner.compareAndSet(null, current)){}}public void unlock (){Thread current = Thread.currentThread();owner.compareAndSet(current, null);}}

对于自旋锁来说,

1、若有同一线程两调用lock() ,会导致第二次调用lock位置进行自旋,产生了死锁说明这个锁并不是可重入的。(在lock函数内,应验证线程是否为已经获得锁的线程)

2、若1问题已经解决,当unlock()第一次调用时,就已经将锁释放了。实际上不应释放锁。(采用计数次进行统计)修改之后,如下:

public class SpinLock1 {private AtomicReference owner =new AtomicReference<>();private int count =0;public void lock(){Thread current = Thread.currentThread();if(current==owner.get()) {count++;return ;} while(!owner.compareAndSet(null, current)){ }}public void unlock (){Thread current = Thread.currentThread();if(current==owner.get()){if(count!=0){count--;}else{owner.compareAndSet(current, null);} } }}

该自旋锁即为可重入锁。

到此,相信大家对"Java中的可重入锁详解"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

线程 函数 内容 实际 死锁 递归 学习 实用 更深 最大 代码 位置 作用 例子 兴趣 内层 外层 实例 实用性 实际上 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 手磨咖啡 广东万易互联网科技有限公司惠州分公司 广东猪兼强互联网科技有限公司 互联网科技巨头监管 万易互联网科技有限公司 远信互联网科技 世界互联网领先科技成果 安徽鑫晟辉互联网科技 互联网科技小额贷款 互联网科技论坛 中国科技互联网公司收入 互联网大会黑科技排名 深圳市优智互联网科技有限公司 朱啸虎曾投资哪些互联网科技企业 科技互联网的核心竞争力 半导体是互联网高科技吗 广州互联网高科技取餐柜 易企秀互联网科技是做什么的 互联网金融运营模式中的金融科技 广州三三互联网科技有限公司 苏州找大状互联网科技有限公司 互联网科技卖菜 猪兼强互联网科技 奇酷互联网络科技 无锡溥仪互联网科技有限公司 衡水科技产业互联网平台 天速互联网络科技有限公司 温州喔噻互联网科技有限公司 互联网科技的全部知识 恒生科技指数 中概互联网
0