死锁不会写在脸上
来源:互联网 发布:淘宝买高仿表 编辑:程序博客网 时间: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;删除也可以
- 死锁不会写在脸上
- 幸福写在脸上。。。
- 写在脸上的健康密码
- 不要把你的心情写在脸上很难
- 单线程中递归包含lock不会死锁
- Word 刚启动是写在add-in中的NewDocument事件为什么不会被触发
- 乐乐会的和不会的 -- 写在乐乐一周…
- 调用指纹时成功和失败写在了block和代理中都不会调用
- 脸上长豆豆了
- PRB: Process.waitFor() 进入一个死锁时父进程不会读取子进程数据
- 内置锁是可重入的,所以在同一个线程重复加锁内不会造成死锁
- Linux 2.6 schedule() 切换进程时没有释放rq->lock却又为何不会导致死锁?
- 主队列中添加的同步操作永远不会被执行,会死锁原因
- JDK并发包---(4)重入锁ReentrantLock:锁申请无限等待且不会产生死锁
- 有10个资源,10个线程,如何保证不会出现死锁?
- 死锁
- 死锁
- 死锁
- DELL BIOS 中英文對照表
- 使用commons-logging的笔记
- 专有类的方式
- 终于开搏
- Visual Studio2005 + Visual SourceSafe 2005 实现团队开发、源代码管理、版本控制
- 死锁不会写在脸上
- 1.17 晴
- 触摸板速度调节及stardict在kde下的发音问题
- Mysql 导出数据表结构
- Vista与 XP双启动修复技巧
- 15所名校计算机专业之特色分析
- Linux下的C语言开发初学者指南
- Double Checked Locking 模式
- linux下的定时同步小记