并发操作之——手写单线程可重入锁实战
并发操作之——手写单线程可重入锁实战
单线程可重入锁代码实战
可重入锁: 也叫递归锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁。
package net.xdclass.xdclasssp.lock;
/**
* @author Cym
* @date 2021/9/8
*/
public class ReentryLock {
/**
* 判断是否已经锁定
*/
private static boolean isLocked = false;
/**
* 加锁+1,解锁-1
*/
private static int lockCount;
/**
* 用于判断加锁线程是否是当前线程
*/
private Thread lockOwner;
/**
* 锁定
*/
private synchronized void lock() throws InterruptedException {
Thread thread = Thread.currentThread();
System.out.println("进入lock加锁" + thread.getName());
//判断是否已被加锁
while (isLocked && lockOwner != thread) {
System.out.println("进入线程等待" + thread.getName());
System.out.println("锁状态 = " + isLocked);
System.out.println("加锁线程 lockOwner = " + lockOwner);
System.out.println("lockCount = " + lockOwner);
wait();
}
isLocked = true;
lockOwner = thread;
lockCount++;
}
/**
* 解锁
*/
private synchronized void unLock() {
Thread thread = Thread.currentThread();
System.out.println("进入线程解锁" + thread.getName());
lockCount--;
//判断当前线程是否是要解锁的线程
if (this.lockOwner == thread) {
//判断是否解锁成功
if(lockCount == 0){
//更改判定值
isLocked = false;
//
//唤醒一个线程
notify();
}
}
}
private static final ReentryLock REENTRY_LOCK = new ReentryLock();
/**
* 方法A
*/
private void methodA() {
try {
REENTRY_LOCK.lock();
System.out.println("方法A被调用");
methodB();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
REENTRY_LOCK.unLock();
}
}
/**
* 方法B
*/
private void methodB() {
try {
REENTRY_LOCK.lock();
System.out.println("方法B被调用");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
REENTRY_LOCK.unLock();
}
}
public static void main(String[] args) {
System.out.println("主线程开始运行" + Thread.currentThread().getName());
REENTRY_LOCK.methodA();
System.out.println("主线程结束运行" + Thread.currentThread().getName());
}
}