1、不可重入锁
public class LockTest01 {
private Lock lock = new Lock();
//做一些事情
public void doSomethings() throws InterruptedException {
lock.lock();
a();
lock.unlock();
}
//在做一些事情
public void a() throws InterruptedException {
lock.lock();
//......................
lock.unlock();
}
public static void main(String[] args) throws InterruptedException {
LockTest01 lt = new LockTest01();
//会忙等
// lt.doSomethings();
lt.a();
}
}
//自定义锁
class Lock {
//判断锁是否被使用
//F 没有被使用
//T 正在被使用
private boolean isLock = false;
//上锁
public synchronized void lock() throws InterruptedException {
//若果被锁上了,就等待
while(isLock) {
wait();
}
//如果没有被锁上,就加锁
isLock = true;
}
//开锁
public synchronized void unlock() {
isLock = false;
notify();
}
}
2、可重入锁
public class LockTest02 {
private Relock lock = new Relock();
//做一些事情
public void doSomethings() throws InterruptedException {
lock.lock();
System.out.println(lock.getCount());
a();
lock.unlock();
System.out.println(lock.getCount());
}
//在做一些事情
public void a() throws InterruptedException {
lock.lock();
System.out.println(lock.getCount());
//......................
lock.unlock();
System.out.println(lock.getCount());
}
public static void main(String[] args) throws InterruptedException {
LockTest02 lt = new LockTest02();
//会忙等
lt.doSomethings();
System.out.println(lt.lock.getCount());
// lt.a();
}
}
//自定义锁
class Relock {
//判断锁是否被使用
//F 没有被使用
//T 正在被使用
private boolean isLock = false;
//计数器
private int holdCount = 0;
//记录当前线程
private Thread lockBy = null;
//上锁
public synchronized void lock() throws InterruptedException {
//保存
Thread t = Thread.currentThread();
//若果被锁上了,就等待
while(isLock && lockBy != t) {
wait();
}
//如果没有被锁上,就加锁
isLock = true;
holdCount++;
lockBy = t;
}
//开锁
public synchronized void unlock() {
//保证是当前线程
if (lockBy == Thread.currentThread()) {
holdCount--;
if (holdCount == 0) {
isLock = false;
lockBy = null;
notify();
}
}
}
public int getCount() {
return holdCount;
}
}