package _readwritelock.copy;
public final class ReadWriteLock {
private int readingReaders = 0;
private int waitingWriters = 0;
private int writingWriters = 0;
private boolean preferWriter = true;
public synchronized void readLock() throws InterruptedException
{
while(writingWriters>0||preferWriter&&waitingWriters>0)
{
wait();
}
readingReaders++;
}
public synchronized void readUnlock()
{
readingReaders--;
preferWriter = true;
notifyAll();
}
public synchronized void writerLock() throws InterruptedException
{
waitingWriters++;
try {
while(readingReaders>0||writingWriters>0){
wait();
}
}finally{
waitingWriters--;
}
writingWriters++;
}
public synchronized void writeUnlock()
{
writingWriters--;
preferWriter = false;
notifyAll();
}
}
package _readwritelock.copy;
public class Data {
private final char[] buffer;
private final ReadWriteLock lock = new ReadWriteLock();
public Data(int size){
buffer = new char[size];
for(int i=0;i<size;i++)
{
buffer[i] = '*';
}
}
public char[] read() throws InterruptedException
{
lock.readLock();
try
{
return doRead();
}
finally
{
lock.readUnlock();
}
}
public void write(char c) throws InterruptedException{
lock.writerLock();
try{
doWrite(c);
}finally{
lock.writeUnlock();
}
}
private char[] doRead() {
char[] newbuf = new char[buffer.length];
for(int i=0;i<buffer.length;i++)
{
newbuf[i] = buffer[i];
}
slowly();
return newbuf;
}
private void doWrite(char c) {
for(int i=0;i<buffer.length;i++)
{
buffer[i] = c;
slowly();
}
}
public void slowly(){
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}