你想模拟死锁,那么就要实现如下的场景:
线程t1:锁定o1,并等待锁定o2
线程t2:锁定o2,并等待锁定o1意思是每个线程都想要同时获取两个对象的锁,而你的代码并不是“同时”获取两个锁,而是获取了一个后释放再获取另一个改成这样就行了:public void run() {
System.out.println("flag = " + flag);
if(flag == 1) {
synchronized(o1) {
try {
Thread.sleep(100);
} catch(InterruptedException e) {
System.out.println("Thread.sleep()出错了。");
e.printStackTrace();
}
synchronized(o2) {
System.out.println("1111111");
}
}
}
if(flag == 0) {
synchronized(o2) {
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
System.out.println("Thread.sleep()出错了。");
e.printStackTrace();
}
synchronized(o1) {
System.out.println("0000000");
}
}
}
}
线程t1:锁定o1,并等待锁定o2
线程t2:锁定o2,并等待锁定o1意思是每个线程都想要同时获取两个对象的锁,而你的代码并不是“同时”获取两个锁,而是获取了一个后释放再获取另一个改成这样就行了:public void run() {
System.out.println("flag = " + flag);
if(flag == 1) {
synchronized(o1) {
try {
Thread.sleep(100);
} catch(InterruptedException e) {
System.out.println("Thread.sleep()出错了。");
e.printStackTrace();
}
synchronized(o2) {
System.out.println("1111111");
}
}
}
if(flag == 0) {
synchronized(o2) {
try {
Thread.sleep(1000);
} catch(InterruptedException e) {
System.out.println("Thread.sleep()出错了。");
e.printStackTrace();
}
synchronized(o1) {
System.out.println("0000000");
}
}
}
}
解决方案 »
- java的String日期类型格式转换
- 终极报错啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~大家不知道是否遇到过~~麻烦大家了。巨星级问题啊。555解决给1000分啊
- 请问String[][]和ArrayList<ArrayList<String>>的内存消耗问题
- 1000! 怎么做?有好的算法没?
- 如何新开一个打印窗口?
- applet放在frame里面运行良好,但是放在网页上不能正确运行
- 怎么在xml里面用<session-timeout>设置2秒
- 请问简单问题,java中有无类似c++中sizeof()操作?
- 我做个了FRAME,加了个菜单,点菜单后,frame会加个PANEL,但是PANEL显示不全,但。。。
- socket传输二进制文件输出是不是要用DataOutputStream?
- Windows下如何让java 应用程序开机自动启动??
- 我想新建一个颜色变量
public class TestDeadLock implements Runnable {
public int flag = 1;
static Object o1 = new Object();
static Object o2 = new Object(); public void run() {
System.out.println("flag = " + flag);
if (flag == 1) {
synchronized (o1) {
//t1锁住了o1
try {
Thread.sleep(100);
} catch (InterruptedException e) {
System.out.println("Thread.sleep()出错了。");
e.printStackTrace();
}
//t1尝试锁o2 ,可o2 已经被t2 给锁住了还没释放,一直等待
synchronized (o2) {
System.out.println("1111111");
}
}
//到了这里才会释放o1的锁
}
if (flag == 0) {
synchronized (o2) {
//t2锁住了o2
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println("Thread.sleep()出错了。");
e.printStackTrace();
}
//t2尝试锁o1,可t1锁住了o1 而且要等待t2释放o2后才能释放o1,就发生死锁了
synchronized (o1) {
System.out.println("0000000");
}
} }
} public static void main(String args[]) {
TestDeadLock td1 = new TestDeadLock ();
TestDeadLock td2 = new TestDeadLock ();
td1.flag = 1;
td2.flag = 0;
Thread t1 = new Thread(td1);
Thread t2 = new Thread(td2);
t1.start();
t2.start();
}
}