당신이 찾고있는 개념은 재진입 잠금입니다. 잠금을 획득하려고 시도 할 수 있어야하며 잠금이 이미 수행 된 경우 차단되지 않아야합니다 (이를 재진입 잠금이라고 함). Java에서이 예제를 설명 할 것이므로 Java에서 재진입 가능 잠금의 기본 구현이 있습니다. (http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/locks/ReentrantLock.html).
tryLock()을 사용할 때 잠금을 사용할 수없는 경우 차단되지 않으므로 작성자/판독기가 진행할 수 있습니다. 그러나 아무도 읽거나 쓰지 않는다고 확신 할 때만 잠금을 해제하려는 경우 독자와 작성자의 수를 유지해야합니다. 이 카운터를 동기화하거나 원자 증가/감소를 허용하는 원시 atomicInteger를 사용해야합니다. 이 예제에서는 원자 정수를 사용했습니다.
Class ReadAndWrite {
private ReentrantLock readLock;
private ReentrantLock writeLock;
private AtomicInteger readers;
private AtomicInteger writers;
private File file;
public void write() {
if (!writeLock.isLocked()) {
readLock.tryLock();
writers.incrementAndGet(); // Increment the number of current writers
// ***** Write your stuff *****
writers.decrementAndGet(); // Decrement the number of current writers
if (readLock.isHeldByCurrentThread()) {
while(writers != 0); // Wait until all writers are finished to release the lock
readLock.unlock();
}
} else {
writeLock.lock();
write();
}
}
public void read() {
if (!readLock.isLocked()) {
writeLock.tryLock();
readers.incrementAndGet();
// ***** read your stuff *****
readers.decrementAndGet(); // Decrement the number of current read
if (writeLock.isHeldByCurrentThread()) {
while(readers != 0); // Wait until all writers are finished to release the lock
writeLock.unlock();
}
} else {
readLock.lock();
read();
}
}
여기에 무슨 일 : 잠금이 당신이 수행하기 위하여려고하고있는 작업을 수행 할 수 있는지 알고 잠긴 경우 먼저 확인할. 잠긴 경우에는 읽거나 쓸 수 없으므로 잠금을 사용하여 대기 상태가되고 잠금이 다시 해제 될 때 동일한 작업을 다시 호출합니다.
잠긴 상태가 아니라면 tryLock을 사용하여 다른 작업 (잠금 쓰기를 읽으려는 경우 또는 그 반대의 경우)을 잠급니다. tryLock은 이미 잠겨 있어도 차단하지 않으므로 여러 작성자가 동시에 작성하고 여러 독자가 동시에 읽을 수 있습니다.당신이 0에 도달 한 것과 같은 일을하는 쓰레드의 수가 첫 번째 장소에서 자물쇠를 든 사람이 이제는 그것을 풀 수 있다는 것을 의미합니다. 이 솔루션의 유일한 불편 함은 잠금을 보유하고있는 스레드가 모든 사용자가 잠금을 해제 할 수있을 때까지 살아 있어야한다는 것입니다.
두 개의 읽기/쓰기 잠금으로 뭔가를 할 수있는 것처럼 느껴집니다. 그러나 나는 그것을 완전히 풀 수는 없었다. – APKar