给出一个java中多线程导致资源竞争的案例
时间: 2024-09-30 16:02:15 浏览: 22
在Java中,当两个或更多的线程同时访问并修改共享的资源时,可能会导致数据竞争(Resource Race Condition),这是多线程编程中常见的并发问题。下面是一个简单的例子:
```java
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized void decrement() {
count--;
}
public static void main(String[] args) throws InterruptedException {
Counter counter = new Counter();
Thread thread1 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.increment();
}
});
Thread thread2 = new Thread(() -> {
for (int i = 0; i < 1000; i++) {
counter.decrement();
}
});
thread1.start();
thread2.start();
// 等待两个线程结束
thread1.join();
thread2.join();
System.out.println("Final Count: " + counter.getCount());
}
// 添加一个getCount方法用于演示
public int getCount() {
return count;
}
}
```
在这个例子中,`increment()` 和 `decrement()` 方法都使用了`synchronized`关键字,确保在同一时刻只有一个线程可以访问它们。但是,如果只对`count`字段加上同步,而没有对整个操作区加锁,那么在一个线程增加计数的同时,另一个线程可能正在减小计数,导致结果错误。
阅读全文