读写锁

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();

       }

    }

 

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值