编写一个类,实现Lock接口,重写lock()和unlock()方法。
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
public class MyLock implements Lock {
private boolean isLocked = false; //是否等待
private Thread lockBy = null; //记录当前线程
private int lockCount = 0; //重入次数
@Override
public synchronized void lock() {
Thread currentThread = Thread.currentThread();
while (isLocked && currentThread != lockBy)
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
isLocked = true;
lockBy = currentThread;
lockCount ++;
}
@Override
public synchronized void unlock() {
if(lockBy == Thread.currentThread()) {
lockCount --; // 1 0
if(lockCount == 0) {
notify();
isLocked = false;
}
}
}
}
测试可重入:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Demo {
Lock lock = new MyLock();
public void a() {
lock.lock();
System.out.println("a");
b();
lock.unlock();
}
public void b() {
lock.lock();
System.out.println("b");
c();
lock.unlock();
}
public void c() {
lock.lock();
System.out.println("c");
lock.unlock();
}
public static void main(String[] args) {
Demo d = new Demo();
new Thread(new Runnable() {
@Override
public void run() {
d.a();
}
}).start();
// new Thread(new Runnable() {
//
// @Override
// public void run() {
// d.b();
// }
// }).start();
}
}