Я новичок в многопоточности и пытаюсь реализовать неограниченную очередь. Я знаю, что notifyAll пробуждает все потоки, ожидающие на мониторе объекта. Но что произойдет, если я верну объект сразу после пробуждения потоков.
Это вызовет проблемы, т.е. T2 имеет блокировку и находится в синхронизированном блоке, в то время как T1 (исходный поток) возвращает объект после снятия блокировки ? Насколько я понимаю, поскольку состояние не меняется, все должно быть в порядке.
Код следующий:
public <T> T remove(SomeObj someObj) throws InterruptedException {
synchronized (obj) {
while(queue.isEmpty()) {
obj.wait();
}
//some calculation here
T foo = someObj.getTValue();
queue.remove(foo);
return foo;
}
}
public <T> void add(T foo) {
synchronized (obj) {
queue.add(foo);
obj.notifyAll();
}
}