Java多线程并发问题:资源竞争实例
在Java的多线程编程中,资源竞争是一个常见的并发问题。以下是一个简单的资源竞争实例:
假设我们有一个共享的缓冲区(比如一个数组),多个线程同时尝试访问和修改这个缓冲区。
示例代码(使用Java Swing线程池):
import javax.swing.SwingUtilities;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ResourceRace {
private int[] buffer = new int[10];
public void threadWorker(int index) {
while (true) { // 无限循环,模拟资源竞争
try {
if (buffer[index] % 2 != 0) { // 模拟修改条件
buffer[index] = buffer[index] + 1;
}
break; // 当满足修改条件时跳出循环
} catch (Exception e) {
System.out.println("Error in worker thread: " + e.getMessage());
Thread.currentThread().interrupt(); // 线程中断,模拟资源释放
return;
}
}
}
public void startThreads() {
ExecutorService executor = Executors.newFixedThreadPool(5); // 创建线程池
for (int i = 0; i < buffer.length; i++) { // 遍历数组并创建线程
SwingUtilities.invokeLater(() -> threadWorker(i)));
}
executor.shutdown(); // 关闭线程池
}
public static void main(String[] args) {
ResourceRace race = new ResourceRace();
race.startThreads(); // 启动线程
}
}
在这个例子中,多个线程同时访问和修改共享的缓冲区。由于没有适当的同步机制,可能会出现数据不一致的情况。
要解决这个问题,通常会使用Java的synchronized关键字、java.util.concurrent.locks.Lock接口或ReentrantLock类来实现线程安全。
还没有评论,来说两句吧...