java - 线程优先级会影响同步块(synchronized block)访问吗?

标签 java multithreading synchronized thread-priority

我有一个 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/

相关文章:

ios - GCD中的dispatch_barrier_async和串行队列,它们有什么区别?

php - 如何从另一个php文件在后台执行一个php文件

java - 为什么同步方法允许多个线程并发运行?

Java 完成工作单元直到收到停止信号

java - JUnit 测试应该重叠吗?

java - 从 Ant 编译同一 Java 软件的多种版本

java - 为 POS 打印机编写正确的 ESC/POS 命令

c - C 多线程环境中的浮点损坏

java - 'synchronized' 真的只是语法糖吗?

java - 如何在 Java 中编写隐含/等价代码