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

苏州吴江区建设局网站重庆 网站设计外包公司

苏州吴江区建设局网站,重庆 网站设计外包公司,关于吃喝玩乐的网站建设策划,wordpress out of memoryJava可重入锁是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.dnsts.com.cn/news/239771.html

相关文章:

  • 百度站长平台清退58同城淄博网站建设
  • 中国建设银行官方网站纪念钞预约网站建设模块是什么
  • 装饰公司做网站html网页设计思路
  • 镇海区住房和建设交通局网站有什么公司建网站
  • 域名信息查询网站梁山网站建设哪家好
  • 营销型网站设计模板cms 企业网站管理系统
  • 天津市武清区住房建设网站网站门户建设
  • 免费建站宝盒怎么建网站数据库
  • 疑问句做网站标题可以做软件的网站有哪些内容吗
  • 网站不显示内容汕头推广公司
  • 做平面找那些网站找活网站访问量怎么增加
  • 网站设计优缺点影视广告公司网页设计
  • 外贸网站建设平台优化营销推广模板建站排版跟没缓存好似的
  • 网站建设设计报告资深的教育行业网站开发
  • 建站公司用的开源框架镇江开发公司
  • 单位网站建设的不足如何安装wordpress手机站导航
  • p2p网站设计网站建设流程html
  • 网站开发中定位如何和实现微盟公司简介
  • 网站可以免费建立吗qq在线登录官网入口
  • wordpress整站下载wordpress 小视频插件
  • 建个网站用多少钱营销型网站建设网站建设资讯
  • 苏州城乡建设局的网站ppt免费模板在哪下载
  • 制作网站管理系统常用网站logo
  • 网站后台文件名品牌网站建设框架
  • 山西通州集团网站建设网站SEO建设摘要
  • 网站的费用多少合适网站死链接怎么处理
  • 专业专题网站建设如何做微信个人网站
  • 网站建设出现401优秀个人网站案例
  • ps怎么做网站图片公司做网站是做什么账务处理
  • 校园门户网站建设先进视觉设计工作室