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

网站建设的步骤过程国家卫健委每日疫情报告

网站建设的步骤过程,国家卫健委每日疫情报告,唐山盘古做网站多少钱,河北三河建设厅网站Java可重入锁是Java并发编程中常用的一种锁机制,它可以允许同一个线程多次获取同一个锁,从而避免死锁和其他并发问题。在本篇博客中,我们将对Java可重入锁的源码进行分析,以便更好地理解它的实现原理和使用方法。 Java可重入锁的…

Java可重入锁是Java并发编程中常用的一种锁机制,它可以允许同一个线程多次获取同一个锁,从而避免死锁和其他并发问题。在本篇博客中,我们将对Java可重入锁的源码进行分析,以便更好地理解它的实现原理和使用方法。

Java可重入锁的实现原理

Java可重入锁的实现基于AQS(AbstractQueuedSynchronizer)框架,它是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 ThreadLocal<HoldCounter> holdCounts = new ThreadLocal<HoldCounter>();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.hkea.cn/news/805337/

相关文章:

  • 爬取漫画数据做网站今日热搜新闻头条
  • 雄安网站建设制作网站关键词如何快速上首页
  • 佛山从事网站建设百度小程序入口官网
  • 自建网站平台可以实现哪些功能网络营销这个专业怎么样
  • 佛山新网站制作公司网页制作成品模板网站
  • 校园网站建设的意见企业管理培训课程网课
  • 郑大远程教育动态网站建设seo优化关键词排名
  • 做logo什么网站昆明百度关键词优化
  • 怎样做省钱购物网站sem推广代运营
  • 英文网站开发公司万网阿里云域名查询
  • 做调查问卷网挣钱的网站新闻 今天
  • 网站建设工作小组在线建站平台免费建网站
  • 可以发广告的网站湖南seo推广系统
  • 大丰网站建设哪家好成都seo
  • 学校网站建设项目的wbsseo交流qq群
  • 筑梦网站建设西安百度竞价开户
  • 个体营业执照可以做网站搞推广吗推广网站制作
  • 公共交通公司网站建设方案移动慧生活app下载
  • 国内开源代码网站搜了网推广效果怎么样
  • html5 metro风格网站模板今日新闻事件
  • 网站不在首页显示出来做网络推广
  • 上海网站seo公司网页推广平台
  • 网站服务器租用价格表百度怎么发布自己的广告
  • 经纪人做网站技巧搜索引擎入口yandex
  • 教育网站制作哪家服务好全球外贸采购网
  • 响应式网络网站源码百度关键词查询网站
  • 南京网站制作设计公司网络运营团队
  • 阿里巴巴上怎样做自己的网站seo网站优化网站编辑招聘
  • 网站做付费推广都需要问什么网络热词2022
  • 给男票做网站表白的软件产品市场推广计划书