从死锁问题说起
java.lang.Thread.State: RUNNABLE?
at StaticThreadInit1$1.run(StaticThreadInit1.java:7)?
Locked ownable synchronizers:?
- None?
"main" prio=6 tid=0x002b9400 nid=0x17a8 runnable [0x0025f000]?
java.lang.Thread.State: RUNNABLE?
at StaticThreadInit1.<clinit>(StaticThreadInit1.java:10)?
Locked ownable synchronizers:?
- None
可以看到 另起的线程,名称为Thread-0 被锁定,而main 也被同样的锁锁住,并且一直在代码中的第10行执行,第10行代码就是 while循环。因此不能正常执行。
二:java的初始化
上面的枚举问题隐含着两个方面的内容
一:多个线程对同一个java类,接口执行初始化操作的时候,会进行同步,只有一个线程得到初始化的机会,其他线程只能进行等待,这正好是synchronized的使用场景,也在上面的枚举死锁问题得到了验证
二:静态属性值得获取会触发java初始化,同时不能正常执行的两个例子告诉我们 初始化的时候包含静态属性和静态代码块的初始化,那java的初始化到底包含哪些方面的内容呢?java的初始化又是按照什么顺序进行的初始化呢?下面说明这个问题。
上面的代码执行下,然后分析下背后的原因。
如果有不明白的,可以看下 下面几篇文章,结合我上面的说明,应该就差不多了。
java类的初始化顺序,java对象初始化顺序,最权威的JLS初始化说明。
?
最后: ?
上面的枚举问题 简单一点就是一个牵涉到java初始化的 死锁问题。前文简单分析了下死锁的原因,同时将java初始化进行了一次的梳理。