博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java 读写锁
阅读量:5171 次
发布时间:2019-06-13

本文共 1272 字,大约阅读时间需要 4 分钟。

http://tutorials.jenkov.com/java-concurrency/read-write-locks.html 翻译

 

     读写锁比LOCK的实现更复杂,想象有一个应用程序能读和写一些资源,但是写没有读多,两个线程读取一些资源并不会出现问题,所以多个线程能读取资源重叠的。如果一个线程想写资源,别的线程就不能操作资源。为了解决允许多个线程读一个线程写,你需要一个读写锁。

     jdk5在java.util.concurrent包实现了读写锁,虽然如此,依然是与意义的去了解背后的实现。

读写锁的java实现

读权限 如果没有线程写,并且没有线程请求写进入

写权限  没有读和写

如果一个线程想读取资源,只要没有线程写,并且没有线程请求写权限是可以,由于写线程有更高的优先级。除此之外,如果读线程发送频率比较高,并且我们不给写线程更高的优先级,饿死现象就会发生。线程请求的写权限将一直被阻塞直到所有读线程释放ReadWriteLock.如果新的线程一直准许获取读权限,导致写线程饿死。因此一个线程能够有读权限如果没有线程被ReadWriteLock锁锁住为写,或者请求已经被锁住为了写。

一个写线程是允许的如果既没有读和写线程锁住该资源。是没有关系的不管有多少线程已经申请写资源或者什么顺序,除非你想保证正正公平的。

有了这些简单的规则在你心里,我们就能实现一个ReadWriteLock

 

public class ReadWriteLock{  private int readers       = 0;  private int writers       = 0;  private int writeRequests = 0;  public synchronized void lockRead() throws InterruptedException{    while(writers > 0 || writeRequests > 0){      wait();    }    readers++;  }  public synchronized void unlockRead(){    readers--;    notifyAll();  }  public synchronized void lockWrite() throws InterruptedException{    writeRequests++;    while(readers > 0 || writers > 0){      wait();    }    writeRequests--;    writers++;  }  public synchronized void unlockWrite() throws InterruptedException{    writers--;    notifyAll();  }}

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/tianc/p/3662830.html

你可能感兴趣的文章
redis(hash篇)
查看>>
Scala实战高手****第12课:Scala函数式编程进阶(匿名函数、高阶函数、函数类型推断、Currying)与Spark源码鉴赏...
查看>>
Hibernate一对多关联
查看>>
python 把函数作为参数 ---高阶函数
查看>>
jQuery + ashx 实现图片按比例预览、异步上传及显示
查看>>
android 代码中使用textAppearance
查看>>
【iOS】UITableViewDelegate 方法没有调用
查看>>
解决code::blocks 17.12不能debug的方法
查看>>
bzoj2961&&bzoj4140 共点圆
查看>>
96:经典实例,判断那一条是闰年:
查看>>
upsource初探
查看>>
让SVN自动更新代码注释中的版本号
查看>>
java中base64
查看>>
常用的mysql操作命令
查看>>
Unity3D的菜单及编辑器扩展
查看>>
我是如何拿到蚂蚁金服 offer 的 ?
查看>>
Android Volley 的基本使用/设置HTTP请求参数、apikey
查看>>
Hibernate框架
查看>>
Vim编辑器的使用总结
查看>>
ArcGIS REST 缓存清除(地图空白不显示的问题 )
查看>>