理解和解决Java多线程并发问题实例
在Java中,多线程并发问题主要涉及共享资源的管理和同步。以下是一个具体的例子:
场景:一个生产者(Producer)和多个消费者(Consumer)的生产-消费循环
// 创建生产者和消费者对象
Producer producer = new Producer();
List<Consumer> consumers = new ArrayList<>();
// 线程启动
new Thread(producer).start();
consumers.forEach(consumer -> {
new Thread(consumer).start();
}});
问题:生产者在没有通知所有消费者的情况下提前停止生产。
解决方法:使用线程同步机制,如synchronized
关键字、Lock
接口等。这里可以考虑用一个共享的信号量(Semaphore)来协调生产与消费的过程。
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Semaphore;
// 信号量实现版本
class SemaphoreImpl implements Semaphore {
private int permits;
public SemaphoreImpl(int permits) {
this.permits = permits;
}
@Override
public synchronized void acquire() {
if (permits > 0) {
permits--;
return;
}
// 线程阻塞,直到信号量可用
wait();
}
@Override
public synchronized void release() {
// 如果信号量小于等于0,则无法释放
if (permits < 1) {
throw new IllegalStateException("Semaphore is not available");
}
permits++;
notifyAll(); // 通知所有等待的线程
}
}
// 使用信号量版本生产者和消费者
Producer producer = new Producer(new SemaphoreImpl(1)));
List<Consumer> consumers = new ArrayList<>();
for (int i = 0; i < 3; i++) {
consumers.add(new Consumer(new SemaphoreImpl(0)))));
}
new Thread(producer).start();
consumers.forEach(consumer -> {
new Thread(consumer).start();
}});
// 生产者停止生产后,消费者会等待信号量可用
这个例子展示了如何使用Semaphore
来协调多线程环境中的生产与消费。
还没有评论,来说两句吧...