我有一個FileScanner線程在列表中添加新文件,並且多個FileParser線程獲取新文件並分別解析自己的文件。爲了同步起見,我在列表中添加了列表並從列表中讀取同步資源塊。問題是,有時FileScanner線程似乎餓死,並且不會進入等待其他FileParser線程釋放資源(列表)的同步塊。 我的問題是,如果我將FileScanner的最大優先級設置爲最小值,將其他FileParser線程的最小值設置爲最小值,它是否可以解決問題? 換句話說,線程優先級是否會影響JVM在線程之間進行選擇以授予對同步塊的訪問權限? 謝謝。線程優先級是否影響同步塊訪問?
UPDATE:
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>();
}
}
使用,而不是同步的一個併發收集會減少爭。 – assylias 2013-02-16 11:07:41
我在http://tutorials.jenkov.com/java-concurrency/starvation-and-fairness.html中找到了解決方案 – 2013-02-19 10:43:28
不知道您在那找到了什麼。這個人似乎試圖重新實現一個已存在於java.util.concurrent包中的鎖。我不認爲這樣做的目的是誠實的(除非你想引入微妙的錯誤)。 – assylias 2013-02-19 10:57:45