Существует общий ресурс, и нам нужно выполнить операции чтения / записи, как показано ниже:
- Когда происходит запись в ресурс, чтение запрещается.
- Когда происходит чтение, запись запрещается, но чтение может выполняться несколькими потоками.
Я написал код, подобный указанному ниже, но проблема этого кода в том, что все чтения будут заблокированы, когда один поток чтения получит блокировку. Далее я думаю использовать логический флаг, например canReadContinue. Теперь, когда read впервые получает блокировку, я переключаю этот флаг на true, и если он равен true, другие потоки не должны пытаться получить блокировку.
class SharedResource {
Lock writeLock
public Object read() {
writeLock.acquire()
doRead()
}
public void write(Object toBeWritten) {
writeLock.acquire()
doWrite(toBeWritten)
writeLock.release()
}
}
Ожидается, что несколько потоков смогут читать, когда запись не ведется.
ОБНОВЛЕНО 1:
открытый класс SharedResource {
private Object writeLock = new Object();
private volatile boolean canReadContinue;
private volatile int readCount;
public void write(Object newState) throws InterruptedException {
synchronized (writeLock) {
// To make sure no read is going on
while (readCount > 0) {
wait();
}
System.out.println("Write thread has the lock.");
doWrite(newState);
}
}
public Object read() {
if(canReadContinue) {
incrementCount();
} else {
synchronized (writeLock) {
System.out.println("Read thread has the lock.");
canReadContinue = true;
incrementCount();
}
}
Object result = doRead();
decrementCount();
if(readCount == 0) {
// TODO - release lock and notify
}
return result;
}
private synchronized void incrementCount() {
readCount++;
}
private synchronized void decrementCount() {
readCount--;
}
private void doWrite(Object newState) {
// do stuff
}
private Object doRead() {
return "";
}
}
Теперь мне нужен механизм для снятия блокировки в строке "// TODO - снять блокировку и уведомить", есть какие-нибудь указатели, как решить эту проблему?