Java并发问题:线程同步与竞态条件示例

原创 - 日理万妓 2024-11-21 05:24 138阅读 0赞

在Java编程中,线程同步和竞态条件是非常重要的概念。下面我们将通过两个示例来理解和解决这些问题。

  1. 线程同步:多线程环境下,多个线程可能会同时访问共享资源,导致数据不一致或错误。线程同步就是防止这种情况发生的机制。

示例:

  1. // 假设我们有一个计数器
  2. class Counter {
  3. private int count;
  4. public synchronized void increment() {
  5. count++;
  6. }
  7. public synchronized int decrement() {
  8. if (count > 0) {
  9. count--;
  10. return count;
  11. } else {
  12. throw new RuntimeException("Counter underflow");
  13. }
  14. }
  15. // 获取当前计数
  16. public synchronized int getCount() {
  17. return count;
  18. }
  19. }
  1. 竞态条件:竞态条件是指多个线程在访问共享资源时的顺序问题。如果管理不当,可能会导致数据不一致。

示例:

  1. // 线程A修改count为5
  2. class ThreadA extends Thread {
  3. private Counter counter;
  4. public ThreadA(Counter counter) {
  5. this.counter = counter;
  6. }
  7. @Override
  8. public void run() {
  9. for (int i = 0; i < 10; i++) {
  10. if (i == 4) {
  11. // 计数改为5,此时线程B已经进入访问count的循环
  12. counter.increment();
  13. }
  14. }
  15. }
  16. }
  17. // 线程B修改count为3
  18. class ThreadB extends Thread {
  19. private Counter counter;
  20. public ThreadB(Counter counter) {
  21. this.counter = counter;
  22. }
  23. @Override
  24. public void run() {
  25. for (int i = 0; i < 10; i++) {
  26. if (i == 7) {
  27. // 线程B进入访问count的循环,此时count应为5
  28. counter.decrement();
  29. }
  30. }
  31. }
  32. }

在上述示例中,线程A修改了共享资源count(初始值为0),而线程B在此之前已经进入了访问count的循环。这就导致了竞态条件:当前count的值不正确。

解决此类问题的方法通常包括使用锁、信号量等同步原语来保护共享资源,或者使用原子操作以确保在多线程环境下的数据一致性。

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

发表评论

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

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

相关阅读