在Jetty源代码中,该jetty-xml
模块XmlConfiguration
具有以下代码:
java private static final XmlParser __parser = initParser();
private synchronized static XmlParser initParser() {
XmlParser parser = new XmlParser();
URL config60 = Loader.getResource(XmlConfiguration.class, "org/eclipse/jetty/xml/configure_6_0.dtd");
URL config76 = Loader.getResource(XmlConfiguration.class, "org/eclipse/jetty/xml/configure_7_6.dtd");
URL config90 = Loader.getResource(XmlConfiguration.class, "org/eclipse/jetty/xml/configure_9_0.dtd");
parser.redirectEntity("configure.dtd", config90);
parser.redirectEntity("configure_1_0.dtd", config60);
parser.redirectEntity("configure_1_1.dtd", config60);
...
return parser;
该__parser
变量使用静态方法initParser()
initialization.the__parser
应该是线程安全的,只有一次由类加载器,为什么加载initParser()
需要使用synchronized
?是否过量?
进一步说明:我从jetty-start
模块调试Jetty源代码,然后调用该jetty-xml
模块。
我认为它根本不需要同步。
Java语言规范保证Java类初始化(即类static
s的初始化,等等)在一个锁内执行,以防止出现竞争情况。无论是一次加载类还是多次加载该类(即通过不同的类加载器),这都适用。
我怀疑这段代码的作者根本不知道JVM如何处理此问题,并且正在采取不必要的预防措施。
(另一方面,这些“安全带”预防措施是无害的,并且对性能的影响很小:可能无法衡量。)
作为记录,类的初始化过程在JLS的12.4.2节中指定。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句