У меня есть одна тема FileScanner, которая добавляет новые файлы в список и несколько потоков FileParser, которые получают новые файлы, и каждый анализирует свои собственные файлы. для синхронизации я поместил добавление в список и прочитал из списка в блоке с синхронизированным ресурсом. проблема в том, что иногда FileScanner Thread, похоже, голодает и не входит в синхронизированный блок, ожидая появления других потоков 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
Я нашел решение в http://tutorials.jenkov.com/java-concurrency/starvation-and-fairness.html –
Не уверен, что вы там нашли. Парень, похоже, пытается переопределить блокировку, которая уже существует в пакете java.util.concurrent. Я не вижу смысла делать это, если честно (если вы не хотите вводить тонкие ошибки). – assylias