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

菏泽建设职业中等专业学校官方网站高新区建网站外包

菏泽建设职业中等专业学校官方网站,高新区建网站外包,成都网站建设排名,电力网站建设Java可重入锁是Java并发编程中常用的一种锁机制#xff0c;它可以允许同一个线程多次获取同一个锁#xff0c;从而避免死锁和其他并发问题。在本篇博客中#xff0c;我们将对Java可重入锁的源码进行分析#xff0c;以便更好地理解它的实现原理和使用方法。 Java可重入锁的…Java可重入锁是Java并发编程中常用的一种锁机制它可以允许同一个线程多次获取同一个锁从而避免死锁和其他并发问题。在本篇博客中我们将对Java可重入锁的源码进行分析以便更好地理解它的实现原理和使用方法。 Java可重入锁的实现原理 Java可重入锁的实现基于AQSAbstractQueuedSynchronizer框架它是Java并发包中的一个重要组件。AQS框架提供了一种通用的同步机制可以用于实现各种锁和同步器。Java可重入锁就是基于AQS框架实现的。 Java可重入锁的实现主要包括以下几个部分 锁状态 Java可重入锁的状态由一个整型变量state表示它表示锁的持有次数。当state为0时表示锁没有被任何线程持有当state大于0时表示锁被某个线程持有且持有次数为state。 获取锁 当一个线程尝试获取Java可重入锁时它会首先尝试获取锁的状态。如果state为0则表示锁没有被任何线程持有此时该线程可以直接获取锁并将state设置为1。如果state大于0则表示锁已经被某个线程持有此时需要判断持有锁的线程是否为当前线程。如果是当前线程则可以直接获取锁并将state加1如果不是当前线程则需要将当前线程加入等待队列并等待锁的释放。 释放锁 当一个线程释放Java可重入锁时它会将锁的状态state减1。如果state减为0则表示锁已经完全释放此时需要唤醒等待队列中的一个线程让它获取锁。如果state仍然大于0则表示锁还被某个线程持有此时只需要将state减1即可。 可重入性 Java可重入锁支持可重入性即同一个线程可以多次获取同一个锁而不会造成死锁或其他并发问题。实现可重入性的关键在于每个线程需要记录自己已经获取锁的次数以便在释放锁时正确地减少锁的持有次数。 Java可重入锁的源码分析 下面我们来看一下Java可重入锁的源码实现。Java可重入锁的主要实现类是ReentrantLock它继承了AQS框架的抽象类AbstractQueuedSynchronizer。 锁状态 Java可重入锁的状态由一个整型变量state表示它定义在AbstractQueuedSynchronizer类中 private volatile int state;获取锁 当一个线程尝试获取Java可重入锁时它会调用tryAcquire方法。该方法首先会判断锁的状态state是否为0如果是则表示锁没有被任何线程持有此时可以直接获取锁并将state设置为1。如果state不为0则需要判断持有锁的线程是否为当前线程。如果是当前线程则可以直接获取锁并将state加1如果不是当前线程则需要将当前线程加入等待队列并等待锁的释放。 protected final boolean tryAcquire(int acquires) {Thread current Thread.currentThread();int c getState();if (c 0) {if (compareAndSetState(0, acquires)) {setExclusiveOwnerThread(current);return true;}} else if (current getExclusiveOwnerThread()) {int nextc c acquires;if (nextc 0) // overflowthrow new Error(Maximum lock count exceeded);setState(nextc);return true;}return false; }释放锁 当一个线程释放Java可重入锁时它会调用tryRelease方法。该方法会将锁的状态state减1。如果state减为0则表示锁已经完全释放此时需要唤醒等待队列中的一个线程让它获取锁。如果state仍然大于0则表示锁还被某个线程持有此时只需要将state减1即可。 protected final boolean tryRelease(int releases) {int c getState() - releases;if (Thread.currentThread() ! getExclusiveOwnerThread())throw new IllegalMonitorStateException();boolean free false;if (c 0) {free true;setExclusiveOwnerThread(null);}setState(c);return free; }可重入性 Java可重入锁支持可重入性即同一个线程可以多次获取同一个锁而不会造成死锁或其他并发问题。实现可重入性的关键在于每个线程需要记录自己已经获取锁的次数以便在释放锁时正确地减少锁的持有次数。Java可重入锁通过ThreadLocal变量来记录每个线程已经获取锁的次数。 private static final class HoldCounter {int count 0;final long tid getThreadId(Thread.currentThread()); }private transient ThreadLocalHoldCounter holdCounts new ThreadLocalHoldCounter();private int getHoldCount() {HoldCounter rh holdCounts.get();return (rh null) ? 0 : rh.count; }private void setHoldCount(int count) {HoldCounter rh holdCounts.get();if (rh null) {rh new HoldCounter();holdCounts.set(rh);}rh.count count; }总结 Java可重入锁是Java并发编程中常用的一种锁机制它可以允许同一个线程多次获取同一个锁从而避免死锁和其他并发问题。Java可重入锁的实现基于AQS框架它通过状态变量state和等待队列来实现锁的获取和释放。Java可重入锁支持可重入性即同一个线程可以多次获取同一个锁而不会造成死锁或其他并发问题。
http://www.yutouwan.com/news/112793/

相关文章:

  • 我的世界做指令的网站百度教育小程序入口
  • 廉价网站建设网站和公众号的区别是什么
  • 做孵化的网站微信公众号推广
  • 自己做的网站能放到网上么绵阳做最好优化网站的
  • 网站建设公司网站制作怎么选一个适合自己的网站
  • 制作一个网站就等于制作一个网页合肥建设银行官网招聘网站
  • 福建泉州曾明军的网站最牛网站设计公司
  • 互联网安全管理服务平台seo技术培训江门
  • 网站建设实施过程电子商务网站开发技术
  • 惠州网站建设 惠州邦网站建设洪塔
  • 网站设计网站公司云主机可以做几个网站
  • 免费信息发布网站大全鹰潭网站商城建设
  • 电子商务网站建设的实训心得西宁知名网站制作公司
  • 学校网站建设材料h5可视化开发工具
  • 门户网站开发哪种语言比较好汉川网站开发
  • 企业网站建站程序新手建什么网站赚钱
  • 重庆定制网站建设地址wordpress设置背景图案
  • 设计师灵感网站淘宝首页设计
  • 站酷官网入口网站建设需要多少天时间
  • 建设一个营销网站的费用上虞网站建设哪家好
  • 杭州专业网站在百度搜不到网站
  • 无锡做食品网站的公司简介网站维护技术
  • dedecms5.7装饰网站模板wordpress主题怎么制作
  • 毕节市网站建设58同城哪个网站可以做ppt
  • 自助建网站平台怎么收费网上建立网站
  • html页面生成器优化网站速度的要点
  • 优秀的设计网站有哪些手机 网站开发软件有哪些
  • 邯郸网站优化平台网站建设模板公司
  • 网站空间托管合同 .docwordpress自定义查询项
  • 恩施网站制作营销网站建设hanyous