JUC-java并发编程-并发工具类-StampedLock源码
发布日期:2021-04-30 21:04:12
浏览次数:80
分类:精选文章
本文共 1373 字,大约阅读时间需要 4 分钟。
Semaphore在Java中是一个强大的信号量工具,用于在多线程环境中实现资源的互斥和同步。以下是对Semaphore工作原理的详细分析:
1. Semaphore的构造方法
Semaphore类提供了两个构造方法:
public Semaphore(int permits):默认使用非公平的Sync策略。public Semaphore(int permits, boolean fair):指定是否使用公平的Sync策略。
默认的非公平策略允许线程在其他线程完成当前请求后立即尝试获取资源,从而提高资源获取效率,但可能导致某些线程长时间等待。公平策略则确保线程在等待队列中的排队顺序,先到先得。
2. acquire()方法
acquire()方法用于获取资源:
- 调用
sync.acquireSharedInterruptibly(1),其中sync是Sync子类的实例。 - Sync类的
acquireSharedInterruptibly(int arg)方法尝试获取指定数量的资源。 - 在非公平的情况下,线程可能多次尝试获取资源,直到成功或被阻塞。
3. release()方法
release()方法用于释放资源:
- 调用
sync.releaseShared(1),尝试释放指定数量的资源。 - Sync类的
tryReleaseShared(int releases)方法尝试释放资源,并返回是否成功。 - 如果成功,AQS的
doReleaseShared()方法会唤醒正在等待的线程,允许它们重新尝试获取资源。
4. 实际应用示例
创建一个Semaphore对象,设置许可证数量为3,然后启动多个线程,每个线程尝试获取资源并执行任务:
Semaphore semaphore = new Semaphore(3);for (int i = 0; i < 5; i++) { new Thread(() -> { try { semaphore.acquire(); log.info("Thread-" + i + "获取资源成功"); Thread.sleep(1000); log.info("Thread-" + i + "完成任务"); } catch (InterruptedException e) { e.printStackTrace(); } finally { semaphore.release(); } }).start();} 5. 分析与优化
通过观察代码执行情况,可以看到:
- 前3个线程(Thread-0, Thread-1, Thread-2)成功获取资源并执行任务。
- 后两个线程(Thread-3, Thread-4)进入等待队列,直到有其他线程释放资源。
6. 总结
Semaphore通过管理资源的获取和释放,帮助线程之间协调合作,避免竞争情况带来的问题。理解其工作原理对于开发多线程应用至关重要,尤其在需要管理资源池或复杂任务调度时。通过合理使用Semaphore,可以有效地提高线程性能和应用稳定性。
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2026年06月13日 12时28分11秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
PHP消息队列的实现方式与详解,值得一看
2023-03-01
PHP混合Go协程并发
2023-03-01
php源码中如何添加滚动公告,给WordPress网站添加滚动公告的方法
2023-03-01
PHP源码安装后如何新增模块
2023-03-01
php源码详细安装步骤,linux下php源码安装步骤
2023-03-01
php漏洞tips
2023-03-01
php版Zencoding之 phpstorm
2023-03-01
PHP版本升级5.4手记
2023-03-01
php版本升级总结
2023-03-01
php版本微信公众号开发
2023-03-01
php版的微信公众号开发演示
2023-03-01
php生成html文件的多种方法介绍
2023-03-01
php生成二维码到图片上
2023-03-01
php生成二维码并下载图片(适应于框架)
2023-03-01
PHP生成及获取JSON文件的方法
2023-03-01
PHP生成唯一不重复的编号
2023-03-01
PHP生成器-动态生成内容的数组
2023-03-01
PHP的ip2long和long2ip升级函数
2023-03-01