// ===== DataAccessPolicyManager2.java (Writer Priority) =====
public class DataAccessPolicyManager2 {
private int readerCount;
private int writerCount;
private Semaphore mutexRead;
private Semaphore mutexWrite;
private Semaphore readTry;
private Semaphore wrt;
public DataAccessPolicyManager2() {
readerCount = 0;
writerCount = 0;
mutexRead = new Semaphore(1);
mutexWrite = new Semaphore(1);
readTry = new Semaphore(1);
wrt = new Semaphore(1);
}
public void acquireReadLock() {
readTry.acquire(); // Prevent new readers when writer is waiting
mutexRead.acquire();
readerCount++;
if (readerCount == 1) {
wrt.acquire(); // First reader blocks writers
}
mutexRead.release();
readTry.release(); // Allow other readers/writers
}
public void releaseReadLock() {
mutexRead.acquire();
readerCount--;
if (readerCount == 0) {
wrt.release(); // Last reader releases writers
}
mutexRead.release();
}
public void acquireWriteLock() {
mutexWrite.acquire();
writerCount++;
if (writerCount == 1) {
readTry.acquire(); // First writer blocks new readers
}
mutexWrite.release();
wrt.acquire(); // Acquire write lock
}
public void releaseWriteLock() {
wrt.release(); // Release write lock
mutexWrite.acquire();
writerCount--;
if (writerCount == 0) {
readTry.release(); // Last writer unblocks readers
}
mutexWrite.release();
}
}
public class DataAccessPolicyManager2 {
private int readerCount;
private int writerCount;
private Semaphore mutexRead;
private Semaphore mutexWrite;
private Semaphore readTry;
private Semaphore wrt;
public DataAccessPolicyManager2() {
readerCount = 0;
writerCount = 0;
mutexRead = new Semaphore(1);
mutexWrite = new Semaphore(1);
readTry = new Semaphore(1);
wrt = new Semaphore(1);
}
public void acquireReadLock() {
readTry.acquire(); // Prevent new readers when writer is waiting
mutexRead.acquire();
readerCount++;
if (readerCount == 1) {
wrt.acquire(); // First reader blocks writers
}
mutexRead.release();
readTry.release(); // Allow other readers/writers
}
public void releaseReadLock() {
mutexRead.acquire();
readerCount--;
if (readerCount == 0) {
wrt.release(); // Last reader releases writers
}
mutexRead.release();
}
public void acquireWriteLock() {
mutexWrite.acquire();
writerCount++;
if (writerCount == 1) {
readTry.acquire(); // First writer blocks new readers
}
mutexWrite.release();
wrt.acquire(); // Acquire write lock
}
public void releaseWriteLock() {
wrt.release(); // Release write lock
mutexWrite.acquire();
writerCount--;
if (writerCount == 0) {
readTry.release(); // Last writer unblocks readers
}
mutexWrite.release();
}
}