【发布时间】:2021-04-22 01:16:13
【问题描述】:
即使锁被写入器线程持有,当运行下面提到的代码时,也会发生以下异常。
作家已进入临界区!信息:在痛苦中保持坚强 锁住了! java.lang.Object.notifyAll 处的线程“Writer”java.lang.IllegalMonitorStateException 中的异常(本机方法)
public class Buffer {
private StringBuilder text;
private final int MAX_PERMITS;
private ReentrantLock writerLock = new ReentrantLock();
private Semaphore semaphore;
public Buffer(int maxPermits) {
text = new StringBuilder();
MAX_PERMITS = maxPermits;
semaphore = new Semaphore(MAX_PERMITS);
}
public void write(String message) throws InterruptedException {
writerLock.lock();
System.out.println(ANSI_BLUE + Thread.currentThread().getName() + " has entered the critical section! Message: " + message);
text.append(message); text.append(". ");
Thread.sleep(2000);
if(writerLock.isHeldByCurrentThread()) {
System.out.println(ANSI_BLUE+"Lock held!");
writerLock.notifyAll();
}
writerLock.unlock();
}
public void read() throws InterruptedException{
if(text.length()==0) return;
writerLock.lock();
semaphore.acquire();
System.out.println(ANSI_GREEN+Thread.currentThread().getName()+" read the following message: "+text.toString());
semaphore.release();
writerLock.unlock();
}
}
【问题讨论】: