Java多线程竞态条件案例
Java多线程中的竞态条件(Race Condition)是指在多个线程同时访问和修改共享资源时,由于执行顺序的不确定性导致的结果不一致。
以下是一个简单的Java多线程竞态条件案例:
// 创建一个类,包含两个共享变量
public class Counter {
private int count1 = 0; // 第一个计数器
private int count2 = 0; // 第二个计数器
public synchronized void increment1() {
count1++;
}
public synchronized void increment2() {
count2++;
}
}
// 创建两个线程,同时操作计数器
public class RaceConditionExample {
public static void main(String[] args) {
Counter counter = new Counter();
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
counter.increment1();
}
}));
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
counter.increment2();
}
}));
thread1.start(); // 开始线程1
thread2.start(); // 开始线程2
try {
thread1.join(); // 等待线程1结束
thread2.join(); // 等待线程2结束
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Counter count1: " + counter.count1);
System.out.println("Counter count2: " + counter.count2);
}
}
在这个例子中,两个线程(thread1和thread2)分别对计数器的两个部分进行增加操作。由于synchronized关键字保证了同一时刻只有一个线程能访问共享资源,因此在大多数情况下不会有竞态条件出现。
然而,如果两个线程的执行顺序恰好相反(如:thread1先执行,然后thread2再执行),那么就可能会出现竞态条件,导致计数器的结果不一致。
还没有评论,来说两句吧...