死锁不会写在脸上

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

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;删除也可以

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值