如果不存在,则将元素添加到synchronizedList

时间:2016-01-15 02:41:58

标签: java multithreading

我有多线程访问这个synchronizedList:downloadsFiles,我想只在这个元素没有退出时才向这个synchronizedList添加元素,是否需要进行以下双重检查和同步?并且有更好的主意吗?

        if (!downloadingFiles.contains(file.getAbsolutePath())) {
        synchronized(this) {
            if (!downloadingFiles.contains(file.getAbsolutePath())) {
                downloadingFiles.add(file.getAbsolutePath());
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

是的,这将有效。但是,通过执行双重检查锁定来获得性能可能不值得额外检查。

换句话说,请考虑不使用第一个if语句,除非您真的希望多个线程经常调用该方法。

此外,如果您实际使用Collections.synchronizedList(),则需要在列表中执行synchronized(...),因为这是内部使用的内容。

synchronized(downloadingFiles) {
    if (!downloadingFiles.contains(file.getAbsolutePath())) {
        downloadingFiles.add(file.getAbsolutePath());
    }
}