Java多线程竞态条件案例

原创 秒速五厘米 2024-09-23 00:01 158阅读 0赞

Java多线程中的竞态条件(Race Condition)是指在多个线程同时访问和修改共享资源时,由于执行顺序的不确定性导致的结果不一致。

以下是一个简单的Java多线程竞态条件案例:

  1. // 创建一个类,包含两个共享变量
  2. public class Counter {
  3. private int count1 = 0; // 第一个计数器
  4. private int count2 = 0; // 第二个计数器
  5. public synchronized void increment1() {
  6. count1++;
  7. }
  8. public synchronized void increment2() {
  9. count2++;
  10. }
  11. }
  12. // 创建两个线程,同时操作计数器
  13. public class RaceConditionExample {
  14. public static void main(String[] args) {
  15. Counter counter = new Counter();
  16. Thread thread1 = new Thread(() -> {
  17. for (int i = 0; i < 10; i++) {
  18. counter.increment1();
  19. }
  20. }));
  21. Thread thread2 = new Thread(() -> {
  22. for (int i = 0; i < 10; i++) {
  23. counter.increment2();
  24. }
  25. }));
  26. thread1.start(); // 开始线程1
  27. thread2.start(); // 开始线程2
  28. try {
  29. thread1.join(); // 等待线程1结束
  30. thread2.join(); // 等待线程2结束
  31. } catch (InterruptedException e) {
  32. e.printStackTrace();
  33. }
  34. System.out.println("Counter count1: " + counter.count1);
  35. System.out.println("Counter count2: " + counter.count2);
  36. }
  37. }

在这个例子中,两个线程(thread1和thread2)分别对计数器的两个部分进行增加操作。由于synchronized关键字保证了同一时刻只有一个线程能访问共享资源,因此在大多数情况下不会有竞态条件出现。

然而,如果两个线程的执行顺序恰好相反(如:thread1先执行,然后thread2再执行),那么就可能会出现竞态条件,导致计数器的结果不一致。

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

发表评论

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

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

相关阅读