Java多线程并发编程:竞态条件示例
在Java多线程并发编程中,竞态条件是指多个线程同时访问和修改共享资源,导致的结果无法预期。
以下是一个简单的竞态条件示例:
// 假设我们有一个计数器类
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
// 创建两个线程,一个增加计数器,另一个查看当前计数器
public class RaceConditionDemo {
public static void main(String[] args) {
Counter counter = new Counter();
// 线程1:增加计数器
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 10; i++) {
counter.increment();
}
}));
// 线程2:查看当前计数器
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Counter count: " + counter.getCount());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}));
// 启动线程
thread1.start();
thread2.start();
// 等待所有线程完成
thread1.join();
thread2.join();
}
}
在这个示例中,两个线程同时对同一个计数器进行操作。由于Java的并发控制是基于锁(synchronized关键字)的,当多个线程试图同一时间获取锁时,就会发生竞态条件。
为了防止这种情况,通常会使用原子操作(Atomic Classes in Java)或者无锁数据结构(Lock-free Data Structures)。
还没有评论,来说两句吧...