我正在寻找最佳实践,并将 PMD 应用于我的 Java EE 项目,但有一条规则说我必须避免使用 java.lang.ThreadGroup,而我现在正在使用它。
规则说这是不安全的,我想知道:为什么?谢谢
我正在寻找最佳实践,并将 PMD 应用于我的 Java EE 项目,但有一条规则说我必须避免使用 java.lang.ThreadGroup,而我现在正在使用它。
规则说这是不安全的,我想知道:为什么?谢谢
出于安全原因使用 ThreadGroup 的概念已被放弃,因为 Thread(Group) 与其正在执行的实际代码之间没有可控的关系。即使是最高特权的线程也可能运行不安全的代码,从而将该代码提升到不希望的级别。因此,正在执行的代码本身(及其来源)用于决定它拥有哪些权限。因此,执行线程及其组对安全性没有任何作用。
所以在那之后,ThreadGroup
没有提供真正的功能。它只是过时了,只是出于历史原因而维护。唯一无法使用的功能是uncaughtException(Thread t, Throwable e)
. 但是自从 Java 5 以来Thread.setUncaughtExceptionHandler( UncaughtExceptionHandler)
,即使没有线程组也可以工作。
是的,很多ThreadGroup
s 方法都不是线程安全的,也没有尝试修复它们,只是因为它们已经过时了。
Joshua Bloch 在“Effective Java”中写道:
最好将线程组视为不成功的实验,您应该直接忽略它们的存在。