手写一个可重入锁

基于的原理:

  1、synchronized

  2、wait,notify方法的搭配使用

代码示例如下:

  

/**
* 手写可重入锁
*/
public class MyLock {
//用于判断是否已经锁了
private boolean islock;
//用于记录锁的线程
private Thread lockThread;
//用于记录锁的次数
private int lockCount;

public synchronized void lock(){
//使用while的原因是,如果wait被唤醒,可以继续判断是否需要继续wait
// 判断的依据是:是否已经被锁了且锁定的线程是否是同一个线程
while (islock && Thread.currentThread() != lockThread){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
islock = true;
if(lockThread == null){
lockThread = Thread.currentThread();
}
//锁一次,自增一。用于解锁时,判断是否需要唤醒等待的线程
lockCount++;
}
public synchronized void unlock(){
if(islock && lockThread == Thread.currentThread()){
lockCount--;
//为0代表当前对象的锁,已经全部释放
if(lockCount == 0 ){
islock = false;
notify();
}
}
}

public static void main(String[] args) {
MethodClass mc = new MethodClass();
mc.a();
}
}
class MethodClass {
MyLock lock = new MyLock();
public void a(){
lock.lock();
System.out.println(Thread.currentThread().getName()+",A");
b(); //重入
lock.unlock();
}
public void b(){
lock.lock();
System.out.println(Thread.currentThread().getName()+",b");
lock.unlock();
}

疑惑:
  跨线程的可重入


原文地址:https://www.cnblogs.com/chen--biao/p/11361550.html