Java读写锁的代码

public final class ReadWriteLock{
    private int readingReaders = 0; //实际正在读取的线程数量
    private int waitingWriters = 0;//正在等待写入的线程数量
    private int writingWriters = 0;//实际正在写入的线程数量
    private boolean preferWriter = true;//写入优先的话,为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 writeLock() throws InterruptedException {      
      waitingWriters++;                      
        try {            
            while (readingReaders > 0 || writingWriters > 0) {
                wait();            
             }      
           } finally {      
            waitingWriters--;
           }      
           writingWriters++;                      
       }
    public synchronized void writeUnlock() {        
            writingWriters--;                    
            preferWriter = false;        
            notifyAll();    
     }
}

使用方法:
   lock.readLock();
    try{
      read();
    }finally{
   lock.readUnlock();
   }
分清锁定的意义:
   使用synchronized,可以获取实例的锁定,java程序的每个实例各有一个"锁定",同一个实例的锁定无法由两个以上的线程所获取。这是制订在java语言规格里,实现在java环境里的机制。因为是一开始就提供的功能,我们称为所谓物理性的锁定。java程序无法去改变这种锁定的行为。
   而"读锁定"与"写锁定"与使用synchronized获取锁定的意义并不同,这不是java语言制订的机制,而是程序员自己实现的,这就是所谓的逻辑上的锁定。当程序员改写ReadWriteLock类时,就可以更改锁定的行为机制。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值