多线程竞态条件:Java实战案例
竞态条件是多线程编程中常见的问题,当多个线程同时访问和修改一个共享资源时,就可能导致竞态条件。
以下是一个简单的Java多线程竞态条件案例:
// 定义共享变量
class SharedResource {
int count = 0;
// 增加方法,供线程操作
synchronized void increment() {
count++;
}
}
// 创建两个线程
Thread thread1 = new Thread(() -> {
try {
SharedResource shared = new SharedResource();
for (int i = 0; i < 5; i++) {
shared.increment(); // 这里可能会出现竞态条件
System.out.println("Thread 1: count " + shared.count); // 打印检查结果
}
} catch (Exception e) {
e.printStackTrace();
}
}));
Thread thread2 = new Thread(() -> {
try {
SharedResource shared = new SharedResource();
for (int i = 0; i < 5; i++) {
shared.increment(); // 这里也可能会出现竞态条件
System.out.println("Thread 2: count " + shared.count); // 打印检查结果
}
} catch (Exception e) {
e.printStackTrace();
}
}));
// 启动线程
thread1.start();
thread2.start();
// 等待所有线程完成
try {
thread1.join();
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
在这个例子中,两个线程Thread 1
和Thread 2
同时访问并修改共享资源shared.count
。如果它们的执行顺序有交叉,就可能导致竞态条件。
为了防止这种问题,通常在共享变量上加上synchronized(this) { ... }
来确保同一时间只有一个线程可以访问该共享资源。
还没有评论,来说两句吧...