在JLS Sec 8.4.3.6, synchronized
methods中,它说:
class BumpTest { // ... static synchronized void classBump() { classCount++; } }
与以下效果完全相同:
class BumpTest { // ... static void classBump() { try { synchronized (Class.forName("BumpTest")) { classCount++; } } catch (ClassNotFoundException e) {} } }
这对我来说看起来很奇怪,更不用说过于复杂了:为什么使用Class.forName("BumpTest")
,而不是BumpTest.class
?不加载是不可能BumpTest
的,因为毕竟它正在执行该类的代码。照原样写,支票ClassNotFoundException
必须被抓住并吞下。
以这种方式写它有什么特别的原因吗?