深入理解:Java线程安全问题实例

原创 深藏阁楼爱情的钟 2024-09-24 06:03 152阅读 0赞

Java线程安全问题主要发生在多线程环境下,如果对共享资源的访问没有正确同步,就可能会引发竞态条件、死锁等问题。下面通过一个实例来深入理解:

实例:生产者-消费者模型

  1. // 1. 生产者
  2. public class Producer {
  3. private final Object lock = new Object();
  4. private int count;
  5. public void produce() {
  6. while (count < 5) { // 生产5个产品
  7. synchronized (lock) {
  8. if (count == 0) {
  9. lock.notifyAll(); // 先通知消费者线程,避免死锁
  10. }
  11. count++;
  12. lock.notify(); // 线程唤醒后继续执行
  13. }
  14. }
  15. }
  16. }
  17. // 2. 消费者
  18. public class Consumer {
  19. private final Object lock = new Object();
  20. private int count;
  21. public void consume() {
  22. while (true) { // 永远循环消费
  23. synchronized (lock) {
  24. if (count == 5) {
  25. lock.notifyAll(); // 生产者已经生产完,通知消费者线程结束循环
  26. }
  27. count++;
  28. lock.notify(); // 线程唤醒后继续执行
  29. }
  30. }
  31. }
  32. }
  33. // 使用示例
  34. public class Main {
  35. public static void main(String[] args) {
  36. Producer producer = new Producer();
  37. Consumer consumer = new Consumer();
  38. new Thread(producer).start(); // 生产者线程
  39. new Thread(consumer).start(); // 消费者线程
  40. try {
  41. Thread.sleep(5000); // 线程睡眠等待
  42. } catch (InterruptedException e) {
  43. e.printStackTrace();
  44. }
  45. }
  46. }

在这个例子中,生产者负责产生产品(count++),而消费者负责消费产品(count--)。如果没有正确同步锁(lock),就可能导致生产者先于消费者完成5个产品的生产,这时消费者线程将无法接收到通知,从而引发问题。

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

发表评论

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

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

相关阅读