上代码
public class DoSome {
private static final DoSome instance = new DoSome();
private DoSome(){
System.out.println("ready");
CountDownLatch await = new CountDownLatch(1);
doing();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("thread ready");
doing();
await.countDown();
}
}).start();
try {
await.await(10000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("done");
}
private static void doing() {
System.out.println("doing");
}
public static void main(String[] args) {
}
}
运行主方法得到结果如下
ready
doing
thread ready
// 中间阻塞了10s
done
doing
问题分析
在装载DoSome时,因为我们存在 static final DoSome instance = new DoSome();
,会去执行构造函数。当前构造函数中可以执行doing()
,线程中也可以输出代码,但是当线程执行到doing()
的时候,阻塞了。直至await结束了之后(可能是类的装载完成了),线程才可以执行doing()
猜测
所以当Class没有装载完成时,其他线程是无法访问当前Class的静态方法?
是的,Java要求类加载是同步的,同一个类不能同时加载