Могу ли я вызвать notifyAll перед возвратом объекта из синхронизированного блока? - PullRequest
1 голос
/ 13 июля 2020

Я новичок в многопоточности и пытаюсь реализовать неограниченную очередь. Я знаю, что 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();
    }
}
...