Java多线程同步问题:条件变量与信号量示例
在Java中,多线程的同步主要通过两种机制实现:条件变量和信号量。这里分别提供这两种同步机制的简单示例:
- 条件变量示例:
import java.util.concurrent.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ConditionalVariableExample {
private Lock lock = new ReentrantLock();
private Condition notReady = lock.newCondition();
private Condition ready = lock.newCondition();
// 线程A,准备执行任务
public void threadAPrepare() {
lock.lock();
try {
notReady.signalAll(); // 通知所有等待条件的线程
System.out.println("Thread A is ready to execute");
ready.await(); // 等待自己被通知为"准备好执行任务"
System.out.println("Thread A has been notified and is executing.");
} finally {
lock.unlock();
}
}
public void startThreadA() {
new Thread(() -> threadAPrepare())).start();
}
}
- 信号量示例:
在Java中,Semaphore
类提供了信号量机制。以下是一个简单的示例:
import java.util.concurrent.Semaphore;
public class SemaphoreExample {
private Semaphore semaphore = new Semaphore(1); // 初始化为1个资源
public void threadA() throws InterruptedException {
semaphore.acquire(); // 获取资源,如果资源不足会阻塞
System.out.println("Thread A is executing.");
semaphore.release(); // 释放资源,如果当前没有获取的资源会被拒绝
}
public void startThreadA() {
new Thread(() -> threadA())).start();
}
}
以上两个示例分别展示了条件变量和信号量在Java多线程中的同步机制。
还没有评论,来说两句吧...