Java多线程同步问题:信号量与条件变量示例
在Java中,多线程的同步通常通过Semaphore
(信号量)和ConditionVariable
(条件变量)来实现。
- 信号量示例:
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
private Semaphore permit = new Semaphore(1); // 初始化一个允许一次进入的信号量
public void acquirePermission() throws InterruptedException {
permit.acquire(); // 获取信号量,如果为空则阻塞
}
public void releasePermission() {
permit.release(); // 释放信号量,可以被其他线程获取
}
}
- 条件变量示例:
import java.util.concurrent.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ConditionVariableExample {
private Lock lock = new ReentrantLock(); // 用锁来管理条件变量的访问
private Condition condition = lock.newCondition(); // 创建一个条件变量
public void waitUntilReady() {
try {
lock.lock(); // 获取锁,使其他线程无法进入临界区
condition.await(); // 等待条件满足,这个过程在条件变量中完成
System.out.println("Thread is ready"); // 当前线程准备好执行任务
} catch (InterruptedException e) {
e.printStackTrace();
// 在这里捕获中断异常,如果需要恢复程序可以在这里处理
} finally {
lock.unlock(); // 释放锁,允许其他线程进入临界区
}
}
public void signalReady() throws InterruptedException {
condition.signalAll(); // 向所有等待条件的线程发出信号
// 在这里假设有一个任务需要当前线程执行
System.out.println("Thread is signaled to be ready for task");
}
}
以上代码示例展示了如何使用Semaphore
和ConditionVariable
来实现多线程同步。
还没有评论,来说两句吧...