Java多线程资源竞争示例

原创 ゝ一纸荒年。 2024-11-29 04:15 59阅读 0赞

在Java中,由于线程的并发执行,资源竞争是常见的问题。下面我们将展示一个简单的例子:共享缓冲区资源竞争。

  1. // 假设我们有一个共享缓冲区数组
  2. public class SharedBuffer {
  3. private final int SIZE = 10;
  4. private int[] buffer;
  5. // 初始化,创建一个大小为10的缓存区
  6. public SharedBuffer() {
  7. buffer = new int[SIZE];
  8. }
  9. // 获取缓冲区元素,如果资源竞争,可能会导致数据不准确
  10. public synchronized int getBufferElement(int index) {
  11. if (index < 0 || index >= SIZE) {
  12. throw new IndexOutOfBoundsException("Invalid index: " + index);
  13. }
  14. return buffer[index];
  15. }
  16. }
  17. // 多线程部分
  18. public class ResourceRaceExample {
  19. private final SharedBuffer buffer;
  20. public ResourceRaceExample(SharedBuffer buffer) {
  21. this.buffer = buffer;
  22. }
  23. public void raceThread(int index, int value) {
  24. Thread thread = new Thread(() -> {
  25. try {
  26. // 线程1,试图获取并修改缓冲区元素
  27. buffer.getBufferElement(index);
  28. buffer.getBufferElement(index) = value; // 修改
  29. // 等待一段时间再进行下一步操作
  30. Thread.sleep(500);
  31. } catch (InterruptedException | IndexOutOfBoundsException e) {
  32. e.printStackTrace();
  33. }
  34. }));
  35. thread.start();
  36. }
  37. public static void main(String[] args) {
  38. SharedBuffer buffer = new SharedBuffer();
  39. ResourceRaceExample example = new ResourceRaceExample(buffer);
  40. example.raceThread(0, 100); // 线程2,尝试获取并修改缓冲区元素
  41. try {
  42. Thread.sleep(2000); // 主线程等待所有子线程执行完毕
  43. } catch (InterruptedException e) {
  44. e.printStackTrace();
  45. }
  46. }
  47. }

在这个例子中,我们有一个共享的缓冲区资源。两个线程(raceThread)试图同时获取并修改这个缓冲区元素。

由于多线程的并发执行,可能出现线程A先获取到数据,但在线程B尝试修改数据时,可能会导致数据不准确的问题,这就是典型的资源竞争问题。

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

发表评论

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

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

相关阅读

    相关 Java线资源竞争示例

    在Java多线程中,资源竞争是一个常见的问题。简单来说,就是多个线程同时争夺有限的资源,如果没有适当的同步机制,可能会导致数据不一致或者死锁等问题。 以下是一个经典的资源共享