死锁原因
1.java加载Class之后, 执行clInit,来执行static代码块.
2.在调用class的任何static变量,必须要等待static代码块,也就是clInit的执行完成.
3.所以在另外一个线程中使用static变量,会触发等待static代码块的结束, 但是在static代码块中又等待了线程的执行结束,就会导致经典的死锁.
使用static代码块要知晓这个问题.
代码
/**
*
*/
package com.test.util;
import com.google.common.util.concurrent.SettableFuture;
public class TestConstant {
public static final int wrapperLength = 11;
private static int a;
static {
final SettableFuture settableFuture = SettableFuture.create();
new Thread(new Runnable() {
@Override
public void run() {
a = 3;
settableFuture.set(null);
}
}).start();
try {
settableFuture.get();
} catch (Exception e) {}
System.out.println("success");
}
public static void init() {
}
public static void main(String[] args) {
init();
}
}