死锁不会写在脸上

来源:互联网 发布:淘宝买高仿表 编辑:程序博客网 时间:2024/04/25 09:02

下面这个程序就是一个死锁程序,你能看明白吗?呵呵

public class LazyLocked{
private static boolean initialized = false;
static {
Thread  t = new Thread(new Runnable() {
public void run() {
initialized = true;
}
});
t.start();
try{
t.join();
}catch (InterruptedException e){
throw new AssertionError(e);
}
}
public static void main(String[] args){
System.out.println(initialized);
}

当调用LazyLocked.main 方法时,它会检查LazyLocked类是否已经被初始化。此时它并没有被初始化,
所以主线程会记录下当前正在进行初始化,并开始对这个类进行初始化。

那个后台线程(t)调用了它的run 方法。在该线程将LazyLocked.initialized 设为true之前,它也会去检查
LazyLocked类是否已经被初始化。这个时候,这个类正在被另外一个线程进行初始化。在这种情况下,
当前线程,也就是那个后台线程(t),会等待Class 对象直到初始化完成。遗憾的是,那个正在进行初始化工作的
线程,也就是主线程,正在等待着后台线程运行结束。因为这2 个线程现在正相互等待着,该程序就死锁了。

正确做法可以这样:

 public class Lazy {
private static boolean initialized = false;
private static Thread t = new Thread(new Runnable() {
public void run() {
initialized = true;
}
});
static {
t.start();
}
public static void main(String[] args){
try{
t.join();
}catch (InterruptedException e){
throw new AssertionError(e);
}
System.out.println(initialized);
}
}

 当然我自己试验了一下子,对于那个有问题的第一个程序,你可以把
initialized = true;删除也可以

原创粉丝点击