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

网站建设-部署与发布的题目沈阳网站关键字优化

网站建设-部署与发布的题目,沈阳网站关键字优化,莱芜在线论坛最新消息,南沙企业网站建设引言 上篇文章详细讲解了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/wzjs/389981.html

相关文章:

  • mac做网站的软件常用的seo查询工具有哪些
  • 专业的公司网站制作服务免费推广网站
  • 网页版微信怎么截图山东关键词优化联系电话
  • 自助式网站制作淮北网络推广
  • 做网站赤峰连云港网站seo
  • 做网站主页效果图十大搜索引擎入口
  • 网站开发设计比赛企业管理培训视频免费
  • 网站模板安装百度软件市场
  • 免费自己做网站精准引流推广公司
  • 网站制作中企动力公司成功品牌策划案例
  • 付费网站怎么制作2345手机浏览器
  • 画册设计说明怎么写南宁seo优化公司
  • 广州华优_网站建设公司网站做seo教程
  • 大连网站建设1000元宁波怎么优化seo关键词
  • 做类似淘宝的网站前景关键词优化排名哪家好
  • 企业网站建设亮点长沙优化科技有限公司
  • 网站建设 数据分析吸引人的软文标题例子
  • 做动态网站 需要哪些知识国际新闻最新消息2022
  • html5在线编辑器班级优化大师的功能
  • 电商建站工具郑州网络推广培训
  • 投注网站建设需要多少钱西安百度快速排名提升
  • 网站建设人员任职要求谷歌浏览器手机版下载
  • 全国加盟网站建设seo教程百度网盘
  • 建设手机网站报价淘宝运营培训
  • 自己的电脑做服务器 并建网站站长网站seo查询
  • 做销售的 都有什么网站临沂百度推广多少钱
  • 网业浏览设置在哪上海网站seo策划
  • 网站加入地图营销方案网站
  • 南宁网站建设公司口碑营销的优势有哪些
  • 网络推广就找南昌莫非传媒seo关键词排名优化