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

龙元建设集团股份有限公司网站地址网站设计素材网站

龙元建设集团股份有限公司网站地址,网站设计素材网站,企业门户网站建设机构,7一12岁手工科技小制作引言 上篇文章详细讲解了AQS底层架构,由等待队列和同步队列以及state信号量来实现,本篇文章将详细讲解JUC包是如何利用这些架构来实现各种组件的 ReentrantLock(可重入锁) ReentrantLock 是一个独占锁,同一时刻只允…

引言

上篇文章详细讲解了AQS底层架构,由等待队列和同步队列以及state信号量来实现,本篇文章将详细讲解JUC包是如何利用这些架构来实现各种组件的

ReentrantLock(可重入锁)

ReentrantLock 是一个独占锁,同一时刻只允许一个线程获取锁。它通过 AQS 的 state 变量来表示锁的重入次数,state 为 0 表示锁未被持有,大于 0 表示锁已被持有,且值表示持有线程的重入次数。

实现细节:

获取锁:ReentrantLock 有公平锁和非公平锁两种实现,它们都继承自 AQS 并重写了 tryAcquire 方法。以非公平锁为例,当线程尝试获取锁时,会先检查 state 是否为 0,如果是则尝试使用 CAS 操作将 state 设为 1,表示获取锁成功;如果 state 不为 0 且当前线程就是持有锁的线程,则将 state 加 1,表示重入。

static final class NonfairSync extends Sync {final void lock() {if (compareAndSetState(0, 1))setExclusiveOwnerThread(Thread.currentThread());elseacquire(1);}protected final boolean tryAcquire(int acquires) {return nonfairTryAcquire(acquires);}
}

释放锁:重写 tryRelease 方法,每次释放锁时将 state 减 1,当 state 减为 0 时,表示锁完全释放,此时会唤醒等待队列中的后继节点。

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;
}

CountDownLatch(倒计时锁存器)

CountDownLatch 用于让一个或多个线程等待其他线程完成操作。它通过 AQS 的 state 变量作为计数器,初始值为需要等待的操作数量,每当一个操作完成时,调用 countDown() 方法将 state 减 1,当 state 减为 0 时,等待的线程会被唤醒。

实现细节:

初始化:在构造函数中设置 state 的初始值。

public CountDownLatch(int count) {if (count < 0) throw new IllegalArgumentException("count < 0");this.sync = new Sync(count);
}private static final class Sync extends AbstractQueuedSynchronizer {Sync(int count) {setState(count);}
}

等待操作完成:调用 await() 方法,线程会尝试获取共享锁,只有当 state 为 0 时才能获取成功,否则线程会进入等待队列。

public void await() throws InterruptedException {sync.acquireSharedInterruptibly(1);
}

操作完成通知:调用 countDown() 方法,会将 state 减 1,当 state 减为 0 时,会唤醒等待队列中的所有线程。

public void countDown() {sync.releaseShared(1);
}

Semaphore(信号量)

Semaphore 用于控制同时访问某个资源的线程数量。它通过 AQS 的 state 变量表示可用的许可数量,线程在访问资源前需要先获取许可(acquire()),访问完成后释放许可(release())。

实现细节:

获取许可:调用 acquire() 方法,线程会尝试获取共享锁,通过减少 state 的值来表示获取许可。如果 state 小于请求的许可数量,则线程会进入等待队列。

public void acquire() throws InterruptedException {sync.acquireSharedInterruptibly(1);
}

释放许可:调用 release() 方法,会增加 state 的值,表示释放许可,同时会唤醒等待队列中的线程。

public void release() {sync.releaseShared(1);
}

http://www.dtcms.com/a/533980.html

相关文章:

  • 苏州基础网站建设音乐播放网站开发pc端
  • 多线程之屏障(Barrier)
  • Matplotlib 安装指南
  • 155.最小栈
  • 网站开发和移动开发成都市房产信息网
  • 乐平市建设局网站精品课程网站建设设计方案
  • 厦门网站建设方案服务公司网站开发建设什么会计科目
  • 深圳网站建设相关推荐wordpress启用主题
  • 为什么360极速浏览器X新建标签页总在所有标签页的最右侧打开?用键盘Ctrl+T新建标签页总在所有标签页最右侧打开解决办法。
  • 中国建设银行网站登陆安徽百度关键词优化
  • 德州网站开发培训网站策划专员招聘
  • 想找个人做网站广州微网站建设
  • 南通e站网站建设外国人在中国注册公司需要什么条件
  • 婚纱摄影网站开题报告河北黄页网
  • 网站 色调企业网站做多大尺寸
  • 人工智能学习中深度学习之python基础之高阶函数
  • 网站前台乱码2022最新永久地域网名
  • 备案网站可以做影视站网站开发中视屏怎样编辑到网页上
  • 株洲网站制作公司在哪里郑州网络推广广告公司
  • 做动图的网站知乎微网站站点名称
  • 提示词类型与示范学习机制(附 Qwen 模型实战代码)
  • 【016】Dubbo3从0到1系列之时间轮
  • 通州区住房和城乡建设部网站一级a做爰片免费网站瑜伽
  • cglib动态代理实现
  • 1.4.4 大数据方法论与实践指南-成本治理(省钱)
  • 自己的公司怎么做网站wordpress注册插件中文版
  • 中华建设杂志网站记者绍兴网站建设报价
  • 做家装的网站有哪些如何做网络推广
  • mysql存储过程和函数
  • 青海省高等级公路建设管局网站免费windows10云主机下载