可重入锁手写实现

简介: 可重入锁手写实现

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


相关文章
|
4月前
|
Java 编译器
手写JAVA线程池
该博客文章介绍了如何手写一个简单的Java线程池,包括创建固定线程、提交任务到并发队列、线程从队列中消费任务以及如何停止线程的实现过程。
|
4月前
|
Java
【多线程面试题二十二】、 说说你对读写锁的了解
这篇文章讨论了读写锁(ReadWriteLock)的概念和应用场景,强调了读写锁适用于读操作远多于写操作的情况,并介绍了Java中`ReentrantReadWriteLock`实现的读写锁特性,包括公平性选择、可重入和可降级。
|
7月前
|
存储 Java
StampedLock(戳记锁)源码解读与使用
StampedLock(戳记锁)源码解读与使用
|
安全 Java 开发者
深入解析ReentrantLock重入锁:Java多线程中的利器
深入解析ReentrantLock重入锁:Java多线程中的利器
1676 4
|
存储 Java
第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】
第二季:5公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁【Java面试题】
67 0
|
7月前
|
监控 Java 应用服务中间件
纯c手写线程池
纯c手写线程池
66 0
|
7月前
|
C++
手写C/C++死锁检测
手写C/C++死锁检测
143 0
|
设计模式 安全 Java
JUC第十二讲:JUC锁 - 看不懂锁核心类 AQS 原理来打我
JUC第十二讲:JUC锁 - 看不懂锁核心类 AQS 原理来打我
|
Java 开发者
JUC系列学习(三):ReentrantLock的使用、源码解析及与Synchronized的异同
`ReentrantLock`同`Synchronized`一样可以实现线程锁的功能,同样具有可重入性,除此之外还可以实现公平锁&非公平锁,其底层是基于`AQS`框架实现的。