Java多线程并发问题:资源竞争实例

原创 迷南。 2024-09-21 06:42 200阅读 0赞

在Java的多线程编程中,资源竞争是一个常见的并发问题。以下是一个简单的资源竞争实例:

假设我们有一个共享的缓冲区(比如一个数组),多个线程同时尝试访问和修改这个缓冲区。

示例代码(使用Java Swing线程池):

  1. import javax.swing.SwingUtilities;
  2. import java.util.concurrent.ExecutorService;
  3. import java.util.concurrent.Executors;
  4. public class ResourceRace {
  5. private int[] buffer = new int[10];
  6. public void threadWorker(int index) {
  7. while (true) { // 无限循环,模拟资源竞争
  8. try {
  9. if (buffer[index] % 2 != 0) { // 模拟修改条件
  10. buffer[index] = buffer[index] + 1;
  11. }
  12. break; // 当满足修改条件时跳出循环
  13. } catch (Exception e) {
  14. System.out.println("Error in worker thread: " + e.getMessage());
  15. Thread.currentThread().interrupt(); // 线程中断,模拟资源释放
  16. return;
  17. }
  18. }
  19. }
  20. public void startThreads() {
  21. ExecutorService executor = Executors.newFixedThreadPool(5); // 创建线程池
  22. for (int i = 0; i < buffer.length; i++) { // 遍历数组并创建线程
  23. SwingUtilities.invokeLater(() -> threadWorker(i)));
  24. }
  25. executor.shutdown(); // 关闭线程池
  26. }
  27. public static void main(String[] args) {
  28. ResourceRace race = new ResourceRace();
  29. race.startThreads(); // 启动线程
  30. }
  31. }

在这个例子中,多个线程同时访问和修改共享的缓冲区。由于没有适当的同步机制,可能会出现数据不一致的情况。

要解决这个问题,通常会使用Java的synchronized关键字、java.util.concurrent.locks.Lock接口或ReentrantLock类来实现线程安全。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,200人围观)

还没有评论,来说两句吧...

相关阅读