我有多线程访问这个synchronizedList:downloadsFiles,我想只在这个元素没有退出时才向这个synchronizedList添加元素,是否需要进行以下双重检查和同步?并且有更好的主意吗?
if (!downloadingFiles.contains(file.getAbsolutePath())) {
synchronized(this) {
if (!downloadingFiles.contains(file.getAbsolutePath())) {
downloadingFiles.add(file.getAbsolutePath());
}
}
}
答案 0 :(得分:0)
是的,这将有效。但是,通过执行双重检查锁定来获得性能可能不值得额外检查。
换句话说,请考虑不使用第一个if语句,除非您真的希望多个线程经常调用该方法。
此外,如果您实际使用Collections.synchronizedList()
,则需要在列表中执行synchronized(...)
,因为这是内部使用的内容。
synchronized(downloadingFiles) {
if (!downloadingFiles.contains(file.getAbsolutePath())) {
downloadingFiles.add(file.getAbsolutePath());
}
}