package com.datascience.executor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReadWriteLock;
/**
* This is dummy implementation that provide no thread safety at all
* but gives logic needed for executor. Use it only when synchronized
* @Author: konrad
*/
public class NotSafeRWLock implements ReadWriteLock {
protected volatile int readersCount;
protected volatile int writersCount;
protected Lock readLock;
protected Lock writeLock;
public NotSafeRWLock(){
readersCount = 0;
writersCount = 0;
readLock = new ReadLock();
writeLock = new WriteLock();
}
@Override
public Lock readLock() {
return readLock;
}
@Override
public Lock writeLock() {
return writeLock;
}
protected static abstract class EmptyLock implements Lock {
@Override
public void lock() {
throw new UnsupportedOperationException();
}
@Override
public void lockInterruptibly() throws InterruptedException {
throw new UnsupportedOperationException();
}
@Override
public boolean tryLock(long l, TimeUnit timeUnit) throws InterruptedException {
throw new UnsupportedOperationException();
}
@Override
public Condition newCondition() {
throw new UnsupportedOperationException();
}
}
class WriteLock extends NotSafeRWLock.EmptyLock {
@Override
public boolean tryLock() {
boolean success = (writersCount + readersCount) == 0;
if (success) {
writersCount = 1;
}
return success;
}
@Override
public void unlock() {
writersCount --;
}
}
class ReadLock extends NotSafeRWLock.EmptyLock {
@Override
public boolean tryLock() {
boolean success = NotSafeRWLock.this.writersCount == 0;
if (success) {
readersCount += 1;
}
return success;
}
@Override
public void unlock() {
readersCount --;
}
}
}