可重入锁手写实现

简介: 可重入锁手写实现

公众号merlinsea


  • 可重入锁的定义:
  • 程调用方法A中获取了锁lock,如果方法A中还调用了方法B,并且方法B还可以获取方法A已经获取的锁,且不会发生死锁,那么lock就是可重入锁。可重入锁针对的是同一个线程里调用不同的方法可重入,并且这个线程执行notify()方法的条件在于该线程内的所有方法都释放了这把锁。
  • 可重入锁的核心实现:
  • 需要记录谁持有了这把锁
  • 需要记录这把锁被同一个线程重入了多少次

  • 代码实现
public class ReentrantLock {
    private boolean isLock = false;  //锁的状态
    private Thread lockOwner = null; //持有锁的线程
    private int lockedCount = 0; // 重入的次数
    public synchronized void lock() throws InterruptedException{
        System.out.println("进入lock()的线程 = " + Thread.currentThread().getName());
        Thread thread = Thread.currentThread();
        while(isLock && thread != lockOwner){
            // 锁已经被持有了并且当前希望进入的线程不等于持有锁的线程
            // 注意我们进行判断锁是否可以进入的时候需要用while循环而不是if
            System.out.println("进入wait状态的线程 = " + thread.getName());
            System.out.println("当前持有锁的线程 = " + lockOwner.getName());
            System.out.println("锁被冲入的次数 = " + lockedCount);
            wait(); // 阻塞于this锁
        }
        isLock = true;
        lockOwner = thread;
        lockedCount++; // 代表重入次数
    }
    public synchronized void unlock(){
        System.out.println("进入unlock()的线程 = " + Thread.currentThread().getName());
        Thread thread = Thread.currentThread();
        if(thread == lockOwner){ // 谁加锁 谁解锁
            lockedCount--;
            if(lockedCount==0){
                // 必须是当前线程已经没有方法持有这个锁了才进行是否
                lockOwner = null;
                isLock = false;
                notify(); // 唤醒阻塞在this锁上的一个线程
            }
        }
    }
}

640.jpg640.jpg


目录
打赏
0
0
0
0
297
分享
相关文章
手写JAVA线程池
该博客文章介绍了如何手写一个简单的Java线程池,包括创建固定线程、提交任务到并发队列、线程从队列中消费任务以及如何停止线程的实现过程。
深入解析ReentrantLock重入锁:Java多线程中的利器
深入解析ReentrantLock重入锁:Java多线程中的利器
2064 4
JUC中的原子操作类及其原理
JUC中的原子操作类及其原理
第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】
第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】
87 0
java多线程之原子操作类
java多线程之原子操作类
|
11月前
|
C++
手写C/C++死锁检测
手写C/C++死锁检测
181 0
JUC第十二讲:JUC锁 - 看不懂锁核心类 AQS 原理来打我
JUC第十二讲:JUC锁 - 看不懂锁核心类 AQS 原理来打我
java锁:第二章:可重入锁和递归锁
java锁:第二章:可重入锁和递归锁
java锁:第二章:可重入锁和递归锁
Java多线程进阶——JUC常见类和死锁
java中的JUC就是java.util.concurrent包下的一些标准类或者接口,这个包里的东西都是和多线程相关的,以下就是这个包中常见的类和接口的用法及示例:
194 0
Java多线程进阶——JUC常见类和死锁
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等