假设有两个线程同时去操作同一个数组,其中一个线程负责向数组中按顺序存入数据,另一个线程负责按顺序取出数据。用Java写
时间: 2024-11-09 22:26:33 浏览: 10
在Java中,处理这种情况通常需要利用synchronized关键字和volatile关键字来保证线程安全,防止数据竞争(Race Condition)。这里提供一个简单的示例:
```java
import java.util.concurrent.atomic.AtomicInteger;
public class ArrayAccessThreadSafe {
private AtomicInteger[] array; // 使用AtomicInteger数组代替普通int数组,保证原子性
public ArrayAccessThreadSafe(int size) {
array = new AtomicInteger[size];
}
// 线程A:往数组中添加数据
public synchronized void insertData(int index, int value) {
array[index] = value;
}
// 线程B:从数组中获取数据
public synchronized int getData(int index) {
return array.get(index);
}
// 示例主函数,创建两个线程并启动
public static void main(String[] args) {
ArrayAccessThreadSafe safeArray = new ArrayAccessThreadSafe(10);
Thread inserter = new Thread(() -> {
for (int i = 0; i < safeArray.array.length; i++) {
try {
Thread.sleep(100); // 模拟工作时间
} catch (InterruptedException e) {
e.printStackTrace();
}
safeArray.insertData(i, i + " data");
}
});
Thread reader = new Thread(() -> {
for (int i = 0; i < safeArray.array.length; i++) {
try {
Thread.sleep(50); // 模拟读取速度慢于插入
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Reading at index " + i + ": " + safeArray.getData(i));
}
});
inserter.start();
reader.start();
// 等待两个线程结束
inserter.join();
reader.join();
}
}
```
在这个例子中,`insertData`和`getData`方法都被`synchronized`修饰,这意味着任何时候只有一个线程可以进入这两个方法。`AtomicInteger`用于保持数组元素的原子性,避免了因多个线程同时修改而产生的可见性问题。
阅读全文