我有一个 FileScanner 线程,用于在列表中添加新文件,以及多个 FileParser 线程,用于获取新文件并每个线程解析自己的文件。为了同步,我将添加到列表并从列表中读取的内容放在同步资源 block 中。问题是有时 FileScanner 线程似乎处于饥饿状态,并且不会进入同步块(synchronized block)等待其他 FileParser 线程释放资源(列表)。 我的问题是,如果我为 FileScanner 设置最大优先级,为其他 FileParser 线程设置最低优先级,是否可以解决问题? 换句话说,线程优先级对 JVM 在线程中进行选择以授予对同步块(synchronized block)的访问权限是否有任何影响? 谢谢。
更新:
private List<ScannerFile> scannedFiles = Collections.synchronizedList(new LinkedList<ScannerFile>()) ;
这在我的 FileScanner 线程中调用:
synchronized(scannedFiles){
for(ScannerFile f: newList)
try{
scannedFiles.add(f);
}
catch(ConcurrentModificationException e){
logger.error(e);
}
}
这在我的 FileParser 线程中被调用:
synchronized(scannedFiles){
try{
for(ScannerFile f: scannedFiles){
if(parserName.equals(f.getParserName()) && f.isNew() == true){
listNewFiles.add(f);
}
}
return listNewFiles;
}
catch(ConcurrentModificationException e){
logger.trace(e);
return new ArrayList<ScannerFile>();
}
}
最佳答案
线程优先级是一种提示或建议,可能会也可能不会产生影响。因此,依靠优先级设置来保证并发程序的正确性是危险的。
来自“Java 并发实践”(Goetz 等人):
Avoid the temptation to use thread priorities, since they can increase platform dependence and can cause liveness problems.[...]
如果你的程序遇到死锁,那么并发逻辑就有问题。更改线程优先级将(在不太可能的最佳情况下)掩盖该问题或(在可能的情况下)引入不确定的硬件特定行为。
您的问题的描述看起来像是 ReadWriteLock 的一个主要示例。 。但是如果没有简洁的代码示例,就很难给出合理的建议。
关于java - 线程优先级会影响同步块(synchronized block)访问吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14909515/