经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
ReentrantReadWriteLock简介
来源:cnblogs  作者:撸码识途  时间:2018/10/21 20:30:35  对本文有异议

对象的方法中一旦加入synchronized修饰,则任何时刻只能有一个线程访问synchronized修饰的方法。假设有个数据对象拥有写方法与读方法,多线程环境中要想保证数据的安全,需对该对象的读写方法都要加入 synchronized同步块。这样任何线程在写入时,其它线程无法读取与改变数据;如果有线程在读取时,其他线程也无法读取或写入。这种方式在写入操作远大于读操作时,问题不大,而当读取远远大于写入时,会造成性能瓶颈,因为此种情况下读取操作是可以同时进行的,而加锁操作限制了数据的并发读取。

 

ReadWriteLock解决了这个问题,当写操作时,其他线程无法读取或写入数据,而当读操作时,其它线程无法写入数据,但却可以读取数据 。

 

读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁!

  1.       private Object data = null;//共享数据,只能有一个线程能写该数据,但可以有多个线程同时读该数据。
  2. private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
  3. public void get(){
  4. rwl.readLock().lock();//上读锁,其他线程只能读不能写
  5. System.out.println(Thread.currentThread().getName() + " be ready to read data!");
  6. try {
  7. Thread.sleep((long)(Math.random()*1000));
  8. } catch (InterruptedException e) {
  9. e.printStackTrace();
  10. }
  11. System.out.println(Thread.currentThread().getName() + "have read data :" + data);
  12. rwl.readLock().unlock(); //释放读锁,最好放在finnaly里面
  13. }
  14. public void put(Object data){
  15. rwl.writeLock().lock();//上写锁,不允许其他线程读也不允许写
  16. System.out.println(Thread.currentThread().getName() + " be ready to write data!");
  17. try {
  18. Thread.sleep((long)(Math.random()*1000));
  19. } catch (InterruptedException e) {
  20. e.printStackTrace();
  21. }
  22. this.data = data;
  23. System.out.println(Thread.currentThread().getName() + " have write data: " + data);
  24. rwl.writeLock().unlock();//释放写锁
  25. }
  26. }

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号