【问题标题】:Thread waiting for resources线程等待资源
【发布时间】:2021-03-16 08:24:55
【问题描述】:

我有一个分配,其中我有 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;
   }
}

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

【问题讨论】:

标签: java multithreading concurrency synchronization thread-safety


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 2017-11-30
    • 1970-01-01
    • 2013-12-13
    相关资源
    最近更新 更多