Ваша конкретная реализация read_start
не эквивалентна простому объявлению метода synchronized
.Как отметил Дж. Скид, вам нужно вызвать notify
(и wait
) для объекта, с которым вы synchronize
работаете.Вы не можете использовать не связанный объект (здесь: класс) для этого.И использование synchronized
, модифицированного для метода, не заставляет метод неявно вызывать wait
или что-то в этом роде.
Кстати, есть реализация блокировок чтения / записи, которая поставляется с ядромJDK: java.util.concurrent.locks.ReentrantReadWriteLock
.Используя этот код, ваш код может выглядеть следующим образом:
class Resource {
private final ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
private final Lock rlock = lock.readLock();
private final Lock wlock = lock.writeLock();
void read() { ... /* caller has to hold the read lock */ ... }
void write() { ... /* caller has to hold the write lock */ ... }
Lock readLock() { return rlock; }
Lock writeLock() { return wlock; }
}
Использование
final Resource r = ...;
r.readLock().lock();
try {
r.read();
} finally {
r.unlock();
}
и аналогичный для операции записи.