不可重入锁:若当前线程执行某个方法已经获取了该锁,那么在方法中尝试再次获取锁时,就会获取不到被阻塞
package lock;
/** 不可重入锁 */
public class NotReentrantDemo {
public static void main(String[] args) {
NotReentrantDemo notReentrantDemo = new NotReentrantDemo();
notReentrantDemo.methodA();
}
private NotReentrantLock notReentrantLock = new NotReentrantLock();
public void methodA() {
try {
notReentrantLock.lock();
methodB();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
notReentrantLock.unlock();
}
}
public void methodB() {
try {
notReentrantLock.lock();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
notReentrantLock.unlock();
}
}
}
class NotReentrantLock {
// 锁状态 true锁 false未琐
private boolean isLocked = false;
// 锁
public synchronized void lock() throws InterruptedException {
System.out.println("进入lock加锁" + Thread.currentThread().getName());
// 如果被锁上进入wait等待
while (isLocked) {
// 进入阻塞状态
wait();
}
// 加锁操作
this.isLocked = true;
}
// 解锁
public synchronized void unlock() {
System.out.println("进入lock解锁" + Thread.currentThread().getName());
// 解锁
this.isLocked = false;
// 唤醒一个线程
notify();
}
}