如何同步两个不是我的线程

时间:2014-08-14 09:43:22

标签: java multithreading

我处在困难的情况下,我需要(因为这个bug)同步两个线程,但我不是这两个线程的创建者(它是我正在使用的软件的一部分)。

我的应用程序中有两个线程使用“相同”数据,但每个线程都有自己的数据副本。我想要实现的是,当一个线程发现(某种程度上)另一个线程已经完成了工作时,我会做什么(我可以修改执行的代码)(我不想再做那个工作)。

我在数据中有一个标识符,我可以用来“标记”工作完成。哪里?哪个对象实例用于此?那是我的问题。我正在寻找一些提示/想法。纯Java是首选,我可以使用一些库。

2 个答案:

答案 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关键字在数据对象中保留一个布尔值。