我很好奇,如果有方法來通知正在等待特定鎖定的線程。我收到異常,據我所知這是因爲我用不同的方法在同步的一段代碼內調用notifyAll()。 據我所知,notifyAll()喚醒所有等待所有鎖的線程。下面是一個代碼是否有可能在等待Java中特定鎖的線程上調用notifyAll()?
public class Buffer {
private static Buffer instance = null;
private boolean full = false;
private boolean empty = true;
private Object lock1 = new Object();
private Object lock2 = new Object();
private char[] arr;
private int i;
private Buffer(){
arr = new char[26];
i = 0;
}
public static synchronized Buffer getInstance(){
if(instance == null){
instance = new Buffer();
}
return instance;
}
public void put(char c){
synchronized(lock1){
while(full){
try{
wait();
}catch(Exception e){}
}
arr[i++] = c;
empty = false;
if(i == 25){
full = true;
notifyAll();
}else{
full = false;
}
}
}
public char get(){
synchronized(lock2){
while(empty){
try{
wait();
}catch(Exception e){}
}
if(--i == 0){
empty = true;
}else{
notifyAll();
}
full = false;
return arr[i];
}
}
public boolean isEmpty(){
return i == 0;
}
}
例外,我得到
java.lang.IllegalMonitorStateException
at java.lang.Object.notifyAll(Native Method)
at Producer_consumer.Buffer.get(Buffer.java:58)
at Producer_consumer.Consumer.run(Consumer.java:14)
at java.lang.Thread.run(Thread.java:745)
或者如果它是不可能的..環境下如何這樣都解決了?
等待一個持有的鎖是你應該儘量不要做的事情。帶回調的生產者 - 消費者隊列可以提供幫助。換句話說,wait-and-notify習語就像併發彙編語言。您應該使用java.util.concurrent中的高級併發API。 – scottb
@scottb你意識到['wait'釋放了鎖](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#wait()),對吧?只有當你調用'wait'的鎖時,你必須持有它,否則會拋出'IllegalMonitortateException'。 –
我現在要做,感謝您的澄清。 – scottb