Java多线程资源竞争示例
在Java中,由于线程的并发执行,资源竞争是常见的问题。下面我们将展示一个简单的例子:共享缓冲区资源竞争。
// 假设我们有一个共享缓冲区数组
public class SharedBuffer {
private final int SIZE = 10;
private int[] buffer;
// 初始化,创建一个大小为10的缓存区
public SharedBuffer() {
buffer = new int[SIZE];
}
// 获取缓冲区元素,如果资源竞争,可能会导致数据不准确
public synchronized int getBufferElement(int index) {
if (index < 0 || index >= SIZE) {
throw new IndexOutOfBoundsException("Invalid index: " + index);
}
return buffer[index];
}
}
// 多线程部分
public class ResourceRaceExample {
private final SharedBuffer buffer;
public ResourceRaceExample(SharedBuffer buffer) {
this.buffer = buffer;
}
public void raceThread(int index, int value) {
Thread thread = new Thread(() -> {
try {
// 线程1,试图获取并修改缓冲区元素
buffer.getBufferElement(index);
buffer.getBufferElement(index) = value; // 修改
// 等待一段时间再进行下一步操作
Thread.sleep(500);
} catch (InterruptedException | IndexOutOfBoundsException e) {
e.printStackTrace();
}
}));
thread.start();
}
public static void main(String[] args) {
SharedBuffer buffer = new SharedBuffer();
ResourceRaceExample example = new ResourceRaceExample(buffer);
example.raceThread(0, 100); // 线程2,尝试获取并修改缓冲区元素
try {
Thread.sleep(2000); // 主线程等待所有子线程执行完毕
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在这个例子中,我们有一个共享的缓冲区资源。两个线程(raceThread
)试图同时获取并修改这个缓冲区元素。
由于多线程的并发执行,可能出现线程A先获取到数据,但在线程B尝试修改数据时,可能会导致数据不准确的问题,这就是典型的资源竞争问题。
还没有评论,来说两句吧...