public class TestDeadLock implements Runnable{
public int flag=1;
static Object o1=new Object(),o2=new Object();
public void run(){
System.out.println("flag ="+flag);
if(flag==1){
synchronized(o1){
try{
Thread.sleep(500);
}
catch(Exception e){
e.printStackTrace();
}
synchronized(o2){
System.out.println("o2 DeadLock");
}
}
}
if(flag==0){
synchronized(o2){
try{
Thread.sleep(500);
}
catch(Exception e){
e.printStackTrace();
}
synchronized(o1){
System.out.println("o2 DeadLock");
}
}
}
}
public static void main(String[] args){
TestDeadLock test1=new TestDeadLock();
TestDeadLock test2=new TestDeadLock();
test1.flag=1;
test2.flag=0;
Thread t1=new Thread(test1);
Thread t2=new Thread(test2);
t1.start();
t2.start();
}
}
为什么 程序会死锁啊
TestDeadLock test1=new TestDeadLock();
TestDeadLock test2=new TestDeadLock();
这两个 new 出来 在内存中的 分布 是不是这样的啊
public int flag=1;
static Object o1=new Object(),o2=new Object();
public void run(){
System.out.println("flag ="+flag);
if(flag==1){
synchronized(o1){
try{
Thread.sleep(500);
}
catch(Exception e){
e.printStackTrace();
}
synchronized(o2){
System.out.println("o2 DeadLock");
}
}
}
if(flag==0){
synchronized(o2){
try{
Thread.sleep(500);
}
catch(Exception e){
e.printStackTrace();
}
synchronized(o1){
System.out.println("o2 DeadLock");
}
}
}
}
public static void main(String[] args){
TestDeadLock test1=new TestDeadLock();
TestDeadLock test2=new TestDeadLock();
test1.flag=1;
test2.flag=0;
Thread t1=new Thread(test1);
Thread t2=new Thread(test2);
t1.start();
t2.start();
}
}
为什么 程序会死锁啊
TestDeadLock test1=new TestDeadLock();
TestDeadLock test2=new TestDeadLock();
这两个 new 出来 在内存中的 分布 是不是这样的啊
解决方案 »
- java 闹钟程序
- 求教:关于实现两个接口
- j2Se从Access中读取数据时乱码问题.高手解决下
- 帮忙看下这个字符串的截取
- 初学者都快把头发挠没了 向众人请教
- 对 Characer类的digit(char ch, int radix)方法的研究
- 关于socket read()的一个问题!请帮忙 谢谢
- 在CORBA中,JAVA写的客户端如何调用C++写的服务器
- 关于jb7的问题。如何让程序中的swing组件在design中可见?请高手指教!
- 簡單問題(0x8000-1900) & 0xf 為幾多呀,& 運算符是做什麼的呀)
- java文件选择问题 急!!!!!!!!!!!!!!
- struts2 spring hibernate 整合错误?????
因为test2的flag被置为0,进入if(flag==0)的那个同步块,获得o2的锁,然后睡眠500ms,这么长的时候test1启动的线程早就获得执行的机会了,进入对应的同步块获得o1的锁,然后睡眠500ms~~过了500ms醒来,一个需要o1的锁才能继续往下执行,一个需要o2的锁才能继续往下执行,但各自此时都无法释放相应的锁给对方,就互相等待着,进入死锁~~~test1启动的线程先执行的话做类似分析~~
synchronized(so)
{
//…..
}
}
这时,锁就是so这个对象,谁拿到这个锁谁就能够运行他所控制的那段代码。当有一个明确的对象作为锁时,就能够这样写程式,但当没有明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁: