当前位置: 首页 > news >正文

福建省建设监理网官方网站手机品牌排行榜

福建省建设监理网官方网站,手机品牌排行榜,电子商务网站开发进什么科目,wordpress登陆好慢AQS之ReentrantReadWriteLock 一. 归纳总结 ReentrantReadWriteLock适合读多写少的场景。是可重入的读写锁实现类。其中, 写锁是独占的#xff0c;读锁是共享的。 支持锁降级#xff08;持有写锁、获取读锁#xff0c;最后释放写锁的过程#xff09; 锁降级可以帮助我们…AQS之ReentrantReadWriteLock 一. 归纳总结 ReentrantReadWriteLock适合读多写少的场景。是可重入的读写锁实现类。其中, 写锁是独占的读锁是共享的。 支持锁降级持有写锁、获取读锁最后释放写锁的过程 锁降级可以帮助我们拿到当前线程修改后的结果而不被其他线程所破坏防止更新丢失。可以保证数据的可见性如果当前线程不获取读锁而是直接释放写锁假设此刻另一个线程记作线程T获取了写锁并修改了数据那么当前线程无法感知线程T的数据更新。如果当前线程获取读锁即遵循锁降级的步骤则线程T将会被阻塞直到当前线程使用数据并释放读锁之后线程T才能获取写锁进行数据更新。 不支持锁升级持有读锁、获取写锁最后释放读锁的过程 目的也是保证数据可见性如果读锁已被多个线程获取其中任意线程成功获取了写锁并更新了数据则其更新对其他获取到读锁的线程是不可见的。 二.读写状态的设计 读写锁对于同步状态的实现是在一个整形变量上通过“按位切割使用”将变量切割成两部分高16位表示读低16位表示写。 假设当前同步状态值为Sget和set的操作如下 1、获取写状态 S0x0000FFFF:将高16位全部抹去2、获取读状态 S16:无符号补0右移16位3、写状态加1 S14、读状态加1 S116即S 0x00010000 在代码层面的判断中同步状态S不等于0时当写状态S0x0000FFFF等于0时则读状态S16大于0即读锁已被获取。 三.写锁的获取与释放 3.1 写锁的获取 写锁是一个支持重进入的排它锁。如果当前线程已经获取了写锁则增加写状态。如果当前线程在获取写锁时读锁已经被获取读状态不为0或者该线程不是已经获取写锁的线程 则当前线程进入等待状态。写锁的获取是通过重写AQS中的tryAcquire方法实现的。 protected final boolean tryAcquire(int acquires) {//当前线程Thread current Thread.currentThread();//获取state状态 存在读锁或者写锁状态就不为0int c getState();//获取写锁的重入数int w exclusiveCount(c);//当前同步状态state ! 0说明已经有其他线程获取了读锁或写锁if (c ! 0) {// c!0 w0 表示存在读锁// 当前存在读锁或者写锁已经被其他写线程获取则写锁获取失败if (w 0 || current ! getExclusiveOwnerThread())return false;// 超出最大范围 65535if (w exclusiveCount(acquires) MAX_COUNT)throw new Error(Maximum lock count exceeded);//同步state状态setState(c acquires);return true;}// writerShouldBlock有公平与非公平的实现, 非公平返回false会尝试通过cas加锁//c0 写锁未被任何线程获取当前线程是否阻塞或者cas尝试获取锁 if (writerShouldBlock() ||!compareAndSetState(c, c acquires))return false;//设置写锁为当前线程所有setExclusiveOwnerThread(current);return true;源码分析 读写互斥写写互斥写锁支持同一个线程重入writerShouldBlock写锁是否阻塞实现取决公平与非公平的策略FairSync和NonfairSync 3.2 读锁的获取 实现共享式同步组件的同步语义需要通过重写AQS的tryAcquireShared方法和tryReleaseShared方法。读锁的获取实现方法为 protected final int tryAcquireShared(int unused) {Thread current Thread.currentThread();int c getState();// 如果写锁已经被获取并且获取写锁的线程不是当前线程当前线程获取读锁失败返回-1 判断锁降级if (exclusiveCount(c) ! 0 getExclusiveOwnerThread() ! current)return -1;//计算出读锁的数量int r sharedCount(c);/*** 读锁是否阻塞 readerShouldBlock()公平与非公平的实现* r MAX_COUNT 持有读锁的线程小于最大数65535* compareAndSetState(c, c SHARED_UNIT) cas设置获取读锁线程的数量*/if (!readerShouldBlock() r MAX_COUNT compareAndSetState(c, c SHARED_UNIT)) { //当前线程获取读锁if (r 0) { //设置第一个获取读锁的线程firstReader current; firstReaderHoldCount 1; //设置第一个获取读锁线程的重入数} else if (firstReader current) { // 表示第一个获取读锁的线程重入firstReaderHoldCount;} else { // 非第一个获取读锁的线程HoldCounter rh cachedHoldCounter;if (rh null || rh.tid ! getThreadId(current))cachedHoldCounter rh readHolds.get();else if (rh.count 0)readHolds.set(rh);rh.count; //记录其他获取读锁的线程的重入次数}return 1;}// 尝试通过自旋的方式获取读锁,实现了重入逻辑return fullTryAcquireShared(current);源码分析 读锁共享读读不互斥读锁可重入每个获取读锁的线程都会记录对应的重入数读写互斥锁降级场景除外支持锁降级持有写锁的线程可以获取读锁但是后续要记得把读锁和写锁读释放readerShouldBlock读锁是否阻塞实现取决公平与非公平的策略FairSync和NonfairSync
http://www.zqtcl.cn/news/509810/

相关文章:

  • 长沙做公司网站有没有免费的云服务器可以用
  • 济南专业网站优化如何制作小程序二维码
  • 建站平台软件猪八戒做网站要多少钱
  • 建设集团网站专业开发网站多少钱
  • 网站制作流程有哪些wordpress众筹
  • 网站打开是建设中手机咋建网站
  • 外贸专业网站的公司建百度网站
  • 北京做网站开发公司有哪些网站技术开发文档模板
  • 图解asp.net网站开发实战外管局网站先支后收怎么做报告
  • 访问自己做的网站吗织梦自动生成手机网站
  • 湖南岳阳网站开发网络公司兰州最好的互联网公司
  • 网站上线 流程网站左侧漂浮代码
  • 基于mvc4商务网站开发网站建设引言
  • 深圳网站设计师西安企业100强
  • dz网站数据备份购物网站配色怎么设计
  • 适合网站开发工程师的公司图片百度搜索
  • 网站界面设计需求wordpress single.php
  • 比较权威的房产网站合肥瑶海区地图全图高清版
  • 网站建设公司果动小学电教检查网站建设资料
  • 电子商务网站设计成功的要素青岛网页设计师
  • 门户网站平台建设方案网站开发后如何上线
  • 濮阳做网站的番禺区网络推广渠道
  • 杭州网站seo外包外链图片
  • 苏州网站建设有限公司枣阳建网站
  • 网站开发平台选择如何制作购物网站
  • 专业建设网站企业外包公司企业网站
  • 网站开发需求确认书国家商标注册官网查询系统
  • 国内个人网站建设wordpress 添加搜索
  • 网站建设创新简述网站开发具体流程
  • wordpress小说网站模板南宁企业网站seo