繁体   English   中英

线程优先级会影响同步块访问吗?

[英]does Thread priority affect the synchronized block access?

我有一个在列表中添加新文件的FileScanner线程,以及一个获取新文件并分别解析自己的文件的多个FileParser线程。 为了同步起见,我将添加项添加到列表中并从列表中读取了同步资源块。 问题是,有时FileScanner线程似乎饿了,没有进入同步块,等待其他FileParser线程释放资源(列表)。 我的问题是,如果我将最大优先级设置为FileScanner,将最小优先级设置为其他FileParser线程,是否可以解决问题? 换句话说,线程优先级是否会对JVM在线程中进行选择以授予对同步块的访问权限有任何影响? 谢谢。

更新:

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等人):

避免使用线程优先级的诱惑,因为它们会增加平台依赖性,并可能导致活动性问题。[...]

如果您的程序遇到死锁,则并发逻辑有问题。 更改线程优先级将(在不太可能的情况下)掩盖该问题,或者(在可能的情况下)引入不确定的硬件特定行为。

您的问题的描述,看起来像是ReadWriteLock的主要示例。 但是,如果没有简洁的代码示例,很难给出合理的建议。

线程优先级不应建立或中断同步。 听起来像是阻塞集合中的问题,无论如何您都不必实现自己。 看看java.util.concurrent中的LinkendBlockingQueue和朋友。

存在逻辑错误。 这应该可以工作(我没有要重新确认的IDE):

LinkedBlockingQueue<ScannerFile> newList = new LinkedBlockingQueue<>();
LinkedBlockingQueue<ScannerFile> scannedFiles = new LinkedBlockingQueue<>();
for(;;){

try{
ScannerFile f = newList.get();
scannedFiles.add(f);
}
catch(InterruptedException ex{
Thread.currentThread.interrupt();
//log
break;
}
}

ThreadParser将如下所示:

for(;;){
try{
ScannedFile f= scannedFiles.get();
//other logic goes here
}catch(InterruptedException ex{
Thread.currentThread.interrupt();
//log
break;
}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM