线程死锁和类初始化探索
/**
* @author: hellkity
* @date: Created in 2020/6/16
* 类说明: 赖加载问题
* 问题 主线程等待后台线程完成 初始化
* 后台线程 run() 会检测类是否初始化, 并等待主线程完成初始化 从而产生死锁
* 总结: 类初始化不要使用其他线程,
* 或者确保主线程先完成类初始化 在启动后台线程
*
* TIS: 当一个线程访问类成员的时候会发生:
* 1 这个类尚未初始化
* 2 这个类正在被当前线程初始化, 这是对初始化的递归请求
* 3 这个类正在被其他线程而不是当前线程初始化
* 4 这个类已经被初始化
*
* 程序执行顺序:
* 1 主线程 Lazy.main() 方法, 检测lazy是否初始化
* 2 执行初始化 initialized =false
* 3 创建后台线程 , 调用run() 方法 , initialized =true ,
* 产生问题: 在给initialized 赋值前 会检测lazy是否初始化. 发现;另一个线程在初始化, 等待初始化完成
* 4 主线程等待后台线程执行完成 产生死锁
*
*/
public class Lazy {
private static boolean initialized = false;
//原始错误 死锁方法
static {
Thread t = new Thread(()->{
initialized = true;
});
t.start();
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//一种不好的处理方法
/*static Thread t = new Thread(()->{
initialized = true;
});
static {
t.start();
}*/
/**
* 测试方法入口
* @param args
*/
public static void main(String[] args) {
//Bad way to eliminate the dead lock , Complex and error prone
/* try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}*/
System.out.println( initialized);
}
}