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,可以有效地提高线程性能和应用稳定性。

上一篇:javascript引用数据类型和堆内存
下一篇:Leetcode--226. 翻转二叉树

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2026年06月13日 12时28分11秒