多线程竞态条件:Java实战案例

原创 妖狐艹你老母 2024-12-05 14:42 74阅读 0赞

竞态条件是多线程编程中常见的问题,当多个线程同时访问和修改一个共享资源时,就可能导致竞态条件。

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

  1. // 定义共享变量
  2. class SharedResource {
  3. int count = 0;
  4. // 增加方法,供线程操作
  5. synchronized void increment() {
  6. count++;
  7. }
  8. }
  9. // 创建两个线程
  10. Thread thread1 = new Thread(() -> {
  11. try {
  12. SharedResource shared = new SharedResource();
  13. for (int i = 0; i < 5; i++) {
  14. shared.increment(); // 这里可能会出现竞态条件
  15. System.out.println("Thread 1: count " + shared.count); // 打印检查结果
  16. }
  17. } catch (Exception e) {
  18. e.printStackTrace();
  19. }
  20. }));
  21. Thread thread2 = new Thread(() -> {
  22. try {
  23. SharedResource shared = new SharedResource();
  24. for (int i = 0; i < 5; i++) {
  25. shared.increment(); // 这里也可能会出现竞态条件
  26. System.out.println("Thread 2: count " + shared.count); // 打印检查结果
  27. }
  28. } catch (Exception e) {
  29. e.printStackTrace();
  30. }
  31. }));
  32. // 启动线程
  33. thread1.start();
  34. thread2.start();
  35. // 等待所有线程完成
  36. try {
  37. thread1.join();
  38. thread2.join();
  39. } catch (InterruptedException e) {
  40. e.printStackTrace();
  41. }

在这个例子中,两个线程Thread 1Thread 2同时访问并修改共享资源shared.count。如果它们的执行顺序有交叉,就可能导致竞态条件。

为了防止这种问题,通常在共享变量上加上synchronized(this) { ... }来确保同一时间只有一个线程可以访问该共享资源。

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

发表评论

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

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

相关阅读