我正在寻找最佳实践,正在将PMD应用于我的Java EE项目,但是一条规则说,我必须避免使用java.lang.ThreadGroup,而现在正在使用它。
规则说这不安全,我想知道:为什么?
谢谢
最佳答案
出于安全原因使用ThreadGroup的概念已被放弃,因为Thread(Group)与它正在执行的实际代码之间没有可控制的关系。即使是最特权的线程也可能运行不安全的代码,从而将该代码提升到不希望的级别。因此,将自己执行的代码(及其源代码)用于确定其具有的权限。因此,执行线程及其组不会以任何方式对安全性起任何作用。
因此,在此之后,ThreadGroup
不提供任何实际功能。它只是过时了,仅出于历史原因进行了维护。没有的唯一功能是uncaughtException(Thread t, Throwable e)
。但是从Java 5开始就有Thread.setUncaughtExceptionHandler( UncaughtExceptionHandler)
了,所以现在即使没有线程组也可以使用。
是的,许多ThreadGroup
方法都不是线程安全的,也没有尝试修复它们,只是因为它们已经过时了。
约书亚·布洛赫(Joshua Bloch)在《有效的Java》中写道:
最好将线程组视为不成功的实验,您应该完全忽略它们的存在。