并发编程挑战:Java多线程同步和互斥问题实例

原创 墨蓝 2024-12-05 23:12 161阅读 0赞

在Java多线程编程中,同步和互斥是两个重要的概念。下面我们将通过一个实例来详细解释。

实例:生产者消费者问题

  1. 生产者(Producer):创建产品并将其放入队列。
  2. 消费者(Consumer):从队列中获取产品进行消费。

在Java中,我们可以使用synchronized关键字来实现同步和互斥。

例如,一个简单的生产者消费者场景:

  1. // 创建两个共享资源对象
  2. private class SharedResource {
  3. private int count;
  4. private Object lock = new Object();
  5. synchronized void increment() {
  6. count++;
  7. notifyAll(); // 一旦计数增加到1,通知所有等待的线程
  8. }
  9. synchronized int getCount() {
  10. return count;
  11. }
  12. }
  13. // 生产者和消费者类实现
  14. public class ProducerConsumerExample {
  15. private SharedResource sharedResource;
  16. public ProducerConsumerExample(SharedResource sharedResource) {
  17. this.sharedResource = sharedResource;
  18. }
  19. // 生产者线程
  20. public void producerThread() {
  21. while (true) { // 无限循环
  22. synchronized (sharedResource.lock) { // 获取锁
  23. if (sharedResource.getCount() < 10) { // 如果资源足够
  24. sharedResource.increment(); // 增加资源
  25. System.out.println("Producer added item to the queue.");
  26. } else {
  27. System.out.println("Queue is full. Producer cannot add items.");
  28. try {
  29. Thread.sleep(2000); // 线程睡眠2秒,模拟处理逻辑的时间
  30. } catch (InterruptedException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. }
  35. }
  36. }
  37. // 消费者线程
  38. public void consumerThread() {
  39. while (true) { // 无限循环
  40. synchronized (sharedResource.lock) { // 获取锁
  41. if (sharedResource.getCount() > 0) { // 如果资源足够
  42. sharedResource.decrement(); // 增加资源
  43. System.out.println("Consumer consumed item from the queue.");
  44. } else {
  45. System.out.println("Queue is empty. Consumer cannot consume items.");
  46. try {
  47. Thread.sleep(2000); // 线程睡眠2秒,模拟处理逻辑的时间
  48. } catch (InterruptedException e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. }
  53. }
  54. }
  55. public static void main(String[] args) {
  56. SharedResource sharedResource = new SharedResource();
  57. // 创建生产者线程并启动
  58. Thread producerThread = new Thread(new ProducerConsumerExample(sharedResource)).producerThread());
  59. producerThread.start();
  60. // 创建消费者线程并启动
  61. Thread consumerThread = new Thread(new ProducerConsumerExample(sharedResource)).consumerThread());
  62. consumerThread.start();
  63. }
  64. }

在这个例子中,生产者(Producer)负责增加队列中的资源(这里为计数),而消费者(Consumer)则负责消耗队列中的资源。通过同步锁,保证了线程间的互斥和正确执行。

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

发表评论

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

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

相关阅读