黑马程序员技术交流社区
标题:
关于一个死锁程序运行的问题
[打印本页]
作者:
不去会死
时间:
2014-6-21 16:00
标题:
关于一个死锁程序运行的问题
本帖最后由 不去会死 于 2014-6-25 22:36 编辑
public class ThreadDieSock implements Runnable {
private int flag = 1;
private Object obj1 = new Object(), obj2 = new Object();
public void run() {
System.out.println("flag=" + flag);
if (flag == 1) {
synchronized (obj1) {
System.out.println("我已经锁定obj1,休息0.5秒后锁定obj2去!");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println("1");
}
}
}
if (flag == 0) {
synchronized (obj2) {
System.out.println("我已经锁定obj2,休息0.5秒后锁定obj1去!");
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj1) {
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
ThreadDieSock run01 = new ThreadDieSock();
ThreadDieSock run02 = new ThreadDieSock();
run01.flag = 1;
run02.flag = 0;
Thread thread01 = new Thread(run01);
Thread thread02 = new Thread(run02);
System.out.println("线程开始喽!");
thread01.start();
thread02.start();
}
}
复制代码
运行结果:
线程开始喽!
flag=0
flag=1
我已经锁定obj2,休息0.5秒后锁定obj1去!
我已经锁定obj1,休息0.5秒后锁定obj2去!
0
1
我的问题是,0 与 1 不是应该不会被打印的吗?有点懵了
作者:
崔湖尧
时间:
2014-6-21 16:30
1. 兄弟,你这里run01和run02是两个独立的对象,分别在各自的线程中运行,也就是各自只有一个线程在运行;
2. 这样开启多线程:Thread thread01 = new Thread(run01);
Thread thread02 = new Thread(run01);
thread01.start();
thread02.start();
作者:
姿_`态
时间:
2014-6-21 18:58
楼上说的对,你要用两个线程去操作同一个对象才会产生死锁。下面是我修改代码,一个是object 锁,一个是this锁,其实你没必要
创建两个对象作为锁,程序没有优化,楼主看看。
public class ThreadDieSock implements Runnable {
private int flag=1;
private Object obj = new Object();
public void run() {
System.out.println("flag=" + flag);
if (flag==1) {
synchronized (this) {
System.out.println("我已经锁定obj1,休息0.5秒后锁定obj2去!");
this.flag=0;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj) {
System.out.println("1");
}
}
}
if (flag==0) {
synchronized (obj) {
System.out.println("我已经锁定obj2,休息0.5秒后锁定obj1去!");
this.flag=1;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (this) {
System.out.println("0");
}
}
}
}
public static void main(String[] args) {
ThreadDieSock run01 = new ThreadDieSock();
Thread thread01 = new Thread(run01);
Thread thread02 = new Thread(run01);
System.out.println("线程开始喽!");
thread01.start();
thread02.start();
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2