Java多线程同步问题:信号量与条件变量示例

原创 旧城等待, 2024-12-08 10:51 147阅读 0赞

在Java中,多线程的同步通常通过Semaphore(信号量)和ConditionVariable(条件变量)来实现。

  1. 信号量示例:
  1. import java.util.concurrent.Semaphore;
  2. public class SemaphoreExample {
  3. private Semaphore permit = new Semaphore(1); // 初始化一个允许一次进入的信号量
  4. public void acquirePermission() throws InterruptedException {
  5. permit.acquire(); // 获取信号量,如果为空则阻塞
  6. }
  7. public void releasePermission() {
  8. permit.release(); // 释放信号量,可以被其他线程获取
  9. }
  10. }
  1. 条件变量示例:
  1. import java.util.concurrent.Condition;
  2. import java.util.concurrent.locks.Lock;
  3. import java.util.concurrent.locks.ReentrantLock;
  4. public class ConditionVariableExample {
  5. private Lock lock = new ReentrantLock(); // 用锁来管理条件变量的访问
  6. private Condition condition = lock.newCondition(); // 创建一个条件变量
  7. public void waitUntilReady() {
  8. try {
  9. lock.lock(); // 获取锁,使其他线程无法进入临界区
  10. condition.await(); // 等待条件满足,这个过程在条件变量中完成
  11. System.out.println("Thread is ready"); // 当前线程准备好执行任务
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. // 在这里捕获中断异常,如果需要恢复程序可以在这里处理
  15. } finally {
  16. lock.unlock(); // 释放锁,允许其他线程进入临界区
  17. }
  18. }
  19. public void signalReady() throws InterruptedException {
  20. condition.signalAll(); // 向所有等待条件的线程发出信号
  21. // 在这里假设有一个任务需要当前线程执行
  22. System.out.println("Thread is signaled to be ready for task");
  23. }
  24. }

以上代码示例展示了如何使用SemaphoreConditionVariable来实现多线程同步。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,147人围观)

还没有评论,来说两句吧...

相关阅读