可重入锁手写实现

简介: 可重入锁手写实现

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


相关文章
|
3天前
|
Java
从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁
从源码入手详解ReentrantLock,一个比synchronized更强大的可重入锁
5 1
|
1月前
|
安全 Java
大厂面试题详解:synchronized的偏向锁和自旋锁怎么实现的
字节跳动大厂面试题详解:synchronized的偏向锁和自旋锁怎么实现的
11 0
|
8月前
|
安全 Java 开发者
深入解析ReentrantLock重入锁:Java多线程中的利器
深入解析ReentrantLock重入锁:Java多线程中的利器
478 4
|
9月前
|
存储 Java
第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】
第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】
32 0
|
4月前
|
存储 安全 Linux
一文搞懂可重入和线程安全
一文搞懂可重入和线程安全
|
4月前
|
C++
手写C/C++死锁检测
手写C/C++死锁检测
55 0
|
7月前
|
设计模式 安全 Java
JUC第十二讲:JUC锁 - 看不懂锁核心类 AQS 原理来打我
JUC第十二讲:JUC锁 - 看不懂锁核心类 AQS 原理来打我
|
12月前
|
Java Linux Spring
简洁明了的ReentrantReadWriteLock总结
一个ReentrantReadWriteLock同时只能存在一个写锁但是可以存在多个读锁,但不能同时存在写锁和读锁。 也即一个资源可以被多个读操作访问或一个写操作访问,但两者不能同时进行.如果有线程正在读,写线程需要等待读线程释放锁后才能获取写锁
51 0
|
安全 Java
java并发原理实战(9)--手动实现一个可重入锁
java并发原理实战(9)--手动实现一个可重入锁
java并发原理实战(9)--手动实现一个可重入锁
|
安全 Java
代码实例详解【可重入锁】和【不可重入锁】区别?
代码实例详解【可重入锁】和【不可重入锁】区别?
代码实例详解【可重入锁】和【不可重入锁】区别?