可重入锁手写实现

简介: 可重入锁手写实现

公众号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


相关文章
|
2月前
|
Java
ReentrantLock(可重入锁)源码解读与使用
ReentrantLock(可重入锁)源码解读与使用
|
2月前
|
Java
从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁
【5月更文挑战第6天】从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁
13 1
|
10月前
|
安全 Java 开发者
深入解析ReentrantLock重入锁:Java多线程中的利器
深入解析ReentrantLock重入锁:Java多线程中的利器
637 4
|
11月前
|
存储 Java
第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】
第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】
36 0
|
2月前
|
C++
手写C/C++死锁检测
手写C/C++死锁检测
75 0
|
9月前
|
设计模式 安全 Java
JUC第十二讲:JUC锁 - 看不懂锁核心类 AQS 原理来打我
JUC第十二讲:JUC锁 - 看不懂锁核心类 AQS 原理来打我
|
SpringCloudAlibaba 前端开发 Java
JUC系列(二)八个有关锁的问题,让你吃透各种场景
8锁就是关于的锁的八个问题,下面也有四个demo类来阐述各种场景下锁的不同状态
JUC系列(二)八个有关锁的问题,让你吃透各种场景
|
安全 Java
java并发原理实战(9)--手动实现一个可重入锁
java并发原理实战(9)--手动实现一个可重入锁
105 0
java并发原理实战(9)--手动实现一个可重入锁
|
存储 SQL Java
面试官问你悲观锁和乐观锁的区别
面试官问你悲观锁和乐观锁的区别
136 0
|
Java
深入浅出ReentrantLock(可重入锁)
深入浅出ReentrantLock(可重入锁)
164 0
深入浅出ReentrantLock(可重入锁)