首页 > 解决方案 > 线程等待资源

问题描述

我有一个分配,其中我有 2 个线程使用共享单例类实例来存储资源列表。当一个线程接收到一个事件时,他会尝试使用共享实例获取资源。通过创建一个布尔字段来获取资源,该字段说明他是否可以为假。问题是,如果一个线程正在使用另一个线程所需的资源,那么另一个线程在等待第二个线程完成时会做什么?我能想到的只是一个while循环,直到他获得所有必需的资源才停止,但它很忙,我试着想一个不同的方法。

public class Thread1{
    private SharedObject sharedObject;
    public void acquire objects(List<Integer> indexes){
        for(int i=0;i<indexes.size;i++){
            sharedObject.acquire(indexes[i]);
        }
    }
}
 // I have another Thread which is implemented the same way
public class SharedObject{
   private List<SomeObject> someObjects;
   public synchronized void acquire(int index){
      someObjects[index].acquire();
   }
}
public class SomeObject{
   private boolean isFree = true;
   public void acquire(){
      isFree = False;
   }
}

所以我的问题是如果在我尝试获取资源时其中一个资源已经在使用中该怎么办

标签: javamultithreadingconcurrencysynchronizationthread-safety

解决方案


使用同步的“boolean resourceWait()”声明单例类,该方法必须由需要任何资源集的线程调用,“resourceRelease()”必须在线程完成某些资源集时调用。它还需要一个最初为空的“等待”线程实例列表,这些线程实例正在等待资源。

声明一个线程类,它公开一个公共资源列表和一个表示私有信号量的'resourcesAvailable() 方法。

在'resourceWait'singleton 锁中,线程可以检查它是否可以立即获取所有资源,如果可以,将它们标记为正在使用,使用'true' 退出同步方法并继续运行。如果线程不能立即获得所有资源,它可以将自己加载到等待列表中,以'false'退出同步方法,然后等待它的私有信号量。

当线程调用释放时,它会将资源标志设置为“空闲”并迭代“等待”列表,寻找现在可以获得所需资源的线程。如果找到一个,它会为等待线程的资源设置“使用中”标志,在等待线程上调用“resourcesAvailable”(发出信号量并设置它准备好/运行),然后退出同步。

没有忙等待循环,没有死锁,易于扩展/修改,易于调试。


推荐阅读