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

网站设计软件下载wordpress外贸主题免费下载

网站设计软件下载,wordpress外贸主题免费下载,应用小程序定制开发,南昌企业做网站我们继续Java多线程与并发系列之旅#xff0c;之前我们分享了Synchronized 和 ReentrantLock 都是独占锁#xff0c;即在同一时刻只有一个线程获取到锁。 然而在有些业务场景中#xff0c;我们大多在读取数据#xff0c;很少写入数据#xff0c;这种情况下#xff0c;如… 我们继续Java多线程与并发系列之旅之前我们分享了Synchronized 和 ReentrantLock 都是独占锁即在同一时刻只有一个线程获取到锁。 然而在有些业务场景中我们大多在读取数据很少写入数据这种情况下如果仍使用独占锁效率将及其低下。 针对这种情况Java提供了读写锁——ReentrantReadWriteLock。 有点类似MySQL数据库为代表的读写分离机制既然我们知道了读写锁是用于读多写少的场景。那问题来了ReentrantReadWriteLock是怎样来实现的呢它与ReentrantLock的实现又有什么的区别呢 带着这些疑问Mike将通过本篇为大家剖析其中的缘由。 本文作者MikeChen10年大厂架构师、CTO持续创作、免费分享【BAT架构技术专题500期】。 文章目录 ReentrantReadWriteLock简介 ReentrantReadWriteLock特性 ReentrantReadWriteLock的主要成员 ReentrantReadWriteLock的实现原理 ReentrantReadWriteLock写锁和读锁的获取与释放 ReentrantReadWriteLock简介 很多情况下有这样一种场景对共享资源有读和写的操作且写操作没有读操作那么频繁。 在没有写操作的时候多个线程同时读一个资源没有任何问题所以应该允许多个线程同时读取共享资源但是如果一个线程想去写这些共享资源就不应该允许其他线程对该资源进行读和写的操作了。 针对这种场景JAVA的并发包提供了读写锁ReentrantReadWriteLock它表示两个锁一个是读操作相关的锁称为共享锁一个是写相关的锁称为排他锁。 ReentrantReadWriteLock特性 公平性读写锁支持非公平和公平的锁获取方式非公平锁的吞吐量优于公平锁的吞吐量默认构造的是非公平锁 可重入在线程获取读锁之后能够再次获取读锁但是不能获取写锁而线程在获取写锁之后能够再次获取写锁同时也能获取读锁 锁降级线程获取写锁之后获取读锁再释放写锁这样实现了写锁变为读锁也叫锁降级 ReentrantReadWriteLock的主要成员和结构图 1. ReentrantReadWriteLock的继承关系 public interface ReadWriteLock {/*** Returns the lock used for reading.** return the lock used for reading.*/Lock readLock;/*** Returns the lock used for writing.** return the lock used for writing.*/Lock writeLock; } 读写锁 ReadWriteLock 读写锁维护了一对相关的锁一个用于只读操作一个用于写入操作。 只要没有写入读取锁可以由多个读线程同时保持,写入锁是独占的。 2.ReentrantReadWriteLock的核心变量 ReentrantReadWriteLock类包含三个核心变量 ReaderLock读锁,实现了Lock接口 WriterLock写锁,也实现了Lock接口 Sync继承自AbstractQueuedSynchronizeAQS,可以为公平锁FairSync 或 非公平锁NonfairSync 3.ReentrantReadWriteLock的成员变量和构造函数 /** 内部提供的读锁 */private final ReentrantReadWriteLock.ReadLock readerLock;/** 内部提供的写锁 */private final ReentrantReadWriteLock.WriteLock writerLock;/** AQS来实现的同步器 */final Sync sync;/*** Creates a new {code ReentrantReadWriteLock} with* 默认创建非公平的读写锁*/public ReentrantReadWriteLock {thisfalse;}/*** Creates a new {code ReentrantReadWriteLock} with* the given fairness policy.** param fair {code true} if this lock should use a fair ordering policy*/public ReentrantReadWriteLockboolean fair {sync fair ? new FairSync : new NonfairSync;readerLock new ReadLockthis;writerLock new WriteLockthis;} ReentrantReadWriteLock的核心实现 ReentrantReadWriteLock实现关键点主要包括 读写状态的设计 写锁的获取与释放 读锁的获取与释放 锁降级 1.读写状态的设计 之前谈ReentrantLock的时候,Sync类是继承于AQS主要以int state为线程锁状态,0表示没有被线程占用1表示已经有线程占用。 同样ReentrantReadWriteLock也是继承于AQS来实现同步那int state怎样同时来区分读锁和写锁的 如果在一个整型变量上维护多种状态就一定需要“按位切割使用”这个变量ReentrantReadWriteLock将int类型的state将变量切割成两部分 高16位记录读锁状态 低16位记录写锁状态 abstract static class Sync extends AbstractQueuedSynchronizer {// 版本序列号private static final long serialVersionUID 6317671515068378041L; // 高16位为读锁低16位为写锁static final int SHARED_SHIFT 16;// 读锁单位static final int SHARED_UNIT 1 SHARED_SHIFT;// 读锁最大数量static final int MAX_COUNT 1 SHARED_SHIFT - 1;// 写锁最大数量static final int EXCLUSIVE_MASK 1 SHARED_SHIFT - 1;// 本地线程计数器private transient ThreadLocalHoldCounter readHolds;// 缓存的计数器private transient HoldCounter cachedHoldCounter;// 第一个读线程private transient Thread firstReader null;// 第一个读线程的计数private transient int firstReaderHoldCount; } 2.写锁的获取与释放 protected final boolean tryAcquireint acquires {/** Walkthrough:* 1. If read count nonzero or write count nonzero* and owner is a different thread, fail.* 2. If count would saturate, fail. This can only* happen if count is already nonzero.* 3. Otherwise, this thread is eligible for lock if* it is either a reentrant acquire or* queue policy allows it. If so, update state* and set owner.*/Thread current Thread.currentThread;int c getState;//获取独占锁写锁的被获取的数量int w exclusiveCountc;if c ! 0 {// Note: if c ! 0 and w 0 then shared count ! 0//1.如果同步状态不为0且写状态为0,则表示当前同步状态被读锁获取//2.或者当前拥有写锁的线程不是当前线程if w 0 || current ! getExclusiveOwnerThreadreturn false;if w exclusiveCountacquires MAX_COUNTthrow new ErrorMaximum lock count exceeded;// Reentrant acquiresetStatec acquires;return true;}if writerShouldBlock ||!compareAndSetStatec, c acquiresreturn false;setExclusiveOwnerThreadcurrent;return true;} 1c是获取当前锁状态,w是获取写锁的状态。 2如果锁状态不为零而写锁的状态为0则表示读锁状态不为0所以当前线程不能获取写锁。或者锁状态不为零而写锁的状态也不为0但是获取写锁的线程不是当前线程则当前线程不能获取写锁。 3写锁是一个可重入的排它锁在获取同步状态时增加了一个读锁是否存在的判断。 写锁的释放与ReentrantLock的释放过程类似每次释放将写状态减1直到写状态为0时才表示该写锁被释放了。 3.读锁的获取与释放 protected final int tryAcquireSharedint unused {for;; {int c getState;int nextc c 116;ifnextc c {throw new ErrorMaxumum lock count exceeded;}ifexclusiveCountc!0 owner ! Thread.currentThreadreturn -1;ifcompareAndSetStatec,nextcreturn 1;} } 1读锁是一个支持重进入的共享锁可以被多个线程同时获取。 2在没有写状态为0时读锁总会被成功获取而所做的也只是增加读状态线程安全 3读状态是所有线程获取读锁次数的总和而每个线程各自获取读锁的次数只能选择保存在ThreadLocal中由线程自身维护。 读锁的每次释放均减小状态线程安全的可能有多个读线程同时释放锁减小的值是116。 4.锁降级 降级是指当前把持住写锁再获取到读锁随后释放先前拥有的写锁的过程。 锁降级过程中的读锁的获取是否有必要答案是必要的。主要是为了保证数据的可见性如果当前线程不获取读锁而直接释放写锁假设此刻另一个线程获取的写锁并修改了数据那么当前线程就步伐感知到线程T的数据更新如果当前线程遵循锁降级的步骤那么线程T将会被阻塞直到当前线程使数据并释放读锁之后线程T才能获取写锁进行数据更新。 5.读锁与写锁的整体流程 ReentrantReadWriteLock总结 本篇详细介绍了ReentrantReadWriteLock的特征、实现、锁的获取过程通过4个关键点的核心设计 读写状态的设计 写锁的获取与释放 读锁的获取与释放 锁降级 从而才能实现共享资源有读和写的操作且写操作没有读操作那么频繁的应用场景。 你可能也喜欢: Redis系列教程(八)分布式锁的由来、及Redis分布式锁的实现详解Java多线程系列八ConcurrentHashMap的实现原理JDK1.7和JDK1.8 Java多线程系列一最全面的Java多线程学习概述 Java多线程系列六深入详解Synchronized同步锁的底层实现 Java多线程系列十源码剖析AQS的实现原理 Java多线程系列(四)4种常用Java线程锁的特点性能比较、使用场景
http://www.zqtcl.cn/news/829561/

相关文章:

  • 北京有哪些网站建设公司好网站做配置文件的作用
  • 网站制作定制做网站顾客提现金额后台
  • 歙县建设银行网站人员优化是什么意思
  • 网站建设需解决问题wp商城
  • 简单房地产网站在哪老版建设银行网站
  • 外贸网站如何做推广苏州小程序需要写网站建设方案书
  • 哪些企业会考虑做网站婚庆策划公司简介
  • php网站开发个人个人学做网站
  • php网站开发最新需求网站建设实习心得
  • 深圳公司的网站设计网页制作视频教程下载
  • 动漫网站开发优势网站做电话线用
  • 河南移动商城网站建设广州营销型企业网站建设
  • 佛山做网站公司个人账号密码网站建设
  • 做零售网站智慧建筑信息平台
  • 山西住房建设厅官方网站建设部建造师网站
  • 加大门户网站安全制度建设wordpress切换数据库
  • 百度代理服务器株洲seo优化
  • 即刻搜索网站提交入口网站中的打赏怎么做的
  • 电子商务网站建设课后作业开发公司管理制度
  • mysql同一数据库放多少个网站表优化大师windows
  • 微信小程序插件开发seo的网站建设
  • 婚纱摄影网站建设方案WordPress 同步网易博客
  • 上海长宁网站建设公司python语言基础
  • 官方网站怎样做餐饮业手机php网站
  • 网站建设企业有哪些内容十九届六中全会
  • 如何管理手机网站首页怎么建设一个社交网站
  • 网站规则山东网站备案网站
  • 成都网站制作龙兵科技做网站原型图用什么软件
  • 鄂州网站网站建设做网站 用哪种
  • 医药公司网站建设厦门网站建设合同