我处在困难的情况下,我需要(因为这个bug)同步两个线程,但我不是这两个线程的创建者(它是我正在使用的软件的一部分)。
我的应用程序中有两个线程使用“相同”数据,但每个线程都有自己的数据副本。我想要实现的是,当一个线程发现(某种程度上)另一个线程已经完成了工作时,我会做什么(我可以修改执行的代码)(我不想再做那个工作)。
我在数据中有一个标识符,我可以用来“标记”工作完成。哪里?哪个对象实例用于此?那是我的问题。我正在寻找一些提示/想法。纯Java是首选,我可以使用一些库。
答案 0 :(得分:0)
您可以创建两个线程都需要访问的Set
。在那里,您存储已由其中一个线程拾取的每个数据对象的ID。需要同步对Set
的访问,但仅限于检索和更新标志的短时间。数据的实际工作是在同步之外完成的。
Set<String> statusSet = new HashSet<String>();
您的线程实现可能如下所示:
void run() {
String dataId = data.getId();
boolean workDone = true;
synchronized (statusSet) {
if (!statusSet.contains(dataId)) {
workDone = false;
statusSet.add(dataId);
}
}
if (!workDone) {
// ... work with the data
}
}
现在,如果你有两个线程都有要处理的相同数据的副本,其中一个将首先进入synchronized (statusSet)
块,而另一个必须等待。第一个线程将发现数据尚未处理并将更新状态集。它将离开同步块并开始处理数据。同时,第二个线程现在可以继续,并且会发现数据已经被标记为已处理。
答案 1 :(得分:0)
解决方案与在Singleton中双重检查相同
在您的应用程序中,您必须使用volatile关键字在数据对象中保留一个布尔值。