理解和解决Java多线程并发问题实例

原创 本是古典 何须时尚 2024-09-18 01:30 145阅读 0赞

在Java中,多线程并发问题主要涉及共享资源的管理和同步。以下是一个具体的例子:

场景:一个生产者(Producer)和多个消费者(Consumer)的生产-消费循环

  1. // 创建生产者和消费者对象
  2. Producer producer = new Producer();
  3. List<Consumer> consumers = new ArrayList<>();
  4. // 线程启动
  5. new Thread(producer).start();
  6. consumers.forEach(consumer -> {
  7. new Thread(consumer).start();
  8. }});

问题:生产者在没有通知所有消费者的情况下提前停止生产。

解决方法:使用线程同步机制,如synchronized关键字、Lock接口等。这里可以考虑用一个共享的信号量(Semaphore)来协调生产与消费的过程。

  1. import java.util.concurrent.CountDownLatch;
  2. import java.util.concurrent.Semaphore;
  3. // 信号量实现版本
  4. class SemaphoreImpl implements Semaphore {
  5. private int permits;
  6. public SemaphoreImpl(int permits) {
  7. this.permits = permits;
  8. }
  9. @Override
  10. public synchronized void acquire() {
  11. if (permits > 0) {
  12. permits--;
  13. return;
  14. }
  15. // 线程阻塞,直到信号量可用
  16. wait();
  17. }
  18. @Override
  19. public synchronized void release() {
  20. // 如果信号量小于等于0,则无法释放
  21. if (permits < 1) {
  22. throw new IllegalStateException("Semaphore is not available");
  23. }
  24. permits++;
  25. notifyAll(); // 通知所有等待的线程
  26. }
  27. }
  28. // 使用信号量版本生产者和消费者
  29. Producer producer = new Producer(new SemaphoreImpl(1)));
  30. List<Consumer> consumers = new ArrayList<>();
  31. for (int i = 0; i < 3; i++) {
  32. consumers.add(new Consumer(new SemaphoreImpl(0)))));
  33. }
  34. new Thread(producer).start();
  35. consumers.forEach(consumer -> {
  36. new Thread(consumer).start();
  37. }});
  38. // 生产者停止生产后,消费者会等待信号量可用

这个例子展示了如何使用Semaphore来协调多线程环境中的生产与消费。

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

发表评论

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

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

相关阅读