08.读写锁的使用.pptVIP

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
08.读写锁的使用

读写锁的使用 本文内容 何时该使用读写锁. 读写锁的写法. 理解读写锁和线程互斥的区别。 复习-同步化的概念 当一个方法或代码块被声明成synchronized,要执行此代码必须先取得一个对象实例或this的锁定,这个锁定要在synchronized修饰的方法或代码块执行完后才能释放掉(无论这段代码是怎样返回的,是正常运行还是异常运行)。每个对象只有一个锁定,如果有两个不同的线程试图同时调用同一对象的同步方法,最终只会有一个能运行此方法,另外一个要等待第一个线程释放掉锁定后才能运行此方法。 读写锁应用的场合 我们有时会遇到对同一个内存区域如数组或者链表进行多线程读写的情况,一般来说有以下几种处理方式: 1.不加任何限制,多见于读取写入都很快的情况,但有时也会出现问题. 2.对读写函数都加以同步互斥,这下问题是没了,但效率也下去了,比如说两个读取线程不是非要排队进入不可. 3.使用读写锁,安全和效率都得到了解决,特别合适读线程多于写线程的情况.也就是下面将要展现的模式. 读写锁的意图 读写锁的本意是分别对读写状态进行互斥区分,有互斥时才加锁,否则放行.互斥的情况有: 1.读写互斥. 2.写写互斥. 不互斥的情况是:读读,这种情况不该加以限制. 程序就是要让锁对象知道当前读写状态,再根据情况对读写的线程进行锁定和解锁。 读写线程都要操作的数据类 读写线程都要操作的数据是链表datas。 注意其中try...finally 的写法,它保证了加锁解锁过程是成对调用的。 public?class?DataLib?{ ????private?ListString?datas; ????private?ReadWriteLock?lock; ????public?DataLib()?{ ????????datas?=?new?ArrayListString(); ????????lock?=?new?ReadWriteLock(); ????} ????//?写入数据,这时不能读取 ????public?void?writeData(ListString?newDatas)?{ ????????try?{ ????????????lock.writeLock(); ????????????Test.sleep(2); ????????????datas=newDatas; ????????}?finally?{ ????????????lock.writeUnlock(); ????????} ????} ????//?读取数据,这时不能写入 ????public?ListString?readData()?{ ????????try?{ ????????????lock.readLock(); ????????????Test.sleep(1);???????????? ????????????return?datas; ????????}?finally?{ ????????????lock.readUnlock(); ????????} ????} } 读写锁ReadWriteLock类 public class ReadWriteLock{ // 读状态 private boolean isRead; // 写状态 private boolean isWrite; public synchronized void readLock(){ // 有写入时读取线程停止 while(isWrite){ try{ System.out.println(有线程在进行写入,读取线程停止,进入等待状态); wait(); } catch(InterruptedException ex){ ex.printStackTrace(); } } System.out.println(设定锁为读取状态); isRead=true; } public synchronized void readUnlock(){ System.out.println(解除读取锁); isRead=false; notifyAll(); }

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档