java一个线程死锁问题

packagecom.jk.deadLock;publicclassDeadLockimplementsRunnable{staticObjectobj1=newObje... package com.jk.deadLock;

public class DeadLock implements Runnable{
static Object obj1 = new Object();
static Object obj2 = new Object();
int flag = 1;

public void run(){
System.out.println(flag);
if(flag == 1)
{
synchronized(obj1){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(obj2)
{
System.out.println("my name is t1");
}
}
}
if(flag == 2)
{
synchronized(obj2){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(obj1)
{
System.out.println("my name is t2");
}
}
}
}

public static void main(String[] args) {
DeadLock d1 = new DeadLock();
DeadLock d2 = new DeadLock();
d1.flag = 1;
d2.flag = 2;
Thread t1 = new Thread(d1);
Thread t2 = new Thread(d2);
t1.start();
t2.start();

}

}

我想问一下为为什么两个Object对象都要为类变量才会导致发生死锁呢。我去掉static便不会发生死锁。类变量在内存中只有一个副本,实例变量每创建一个实例便产生一个副本。这里如果为实例变量,也并没有创建多个副本哦。有些不太明白,望各位指教!
展开
 我来答
axblunt
2010-04-01 · TA获得超过466个赞
知道答主
回答量:93
采纳率:0%
帮助的人:152万
展开全部
这里如果不为static,当然就创建了多个副本啊。
因为如果不为static,当执行完以下两行时:
DeadLock d1 = new DeadLock();
DeadLock d2 = new DeadLock();
内存里会有d1、d2两个DeadLock对象,每个DeadLock对象中会有obj1、obj2两个Object,这点很重要!即内存中对象如下:
d1:{obj1,obj2,flag}
d2:{obj1,obj2,flag}
设置完flag以后,变成:
d1:{obj1,obj2,flag==1}
d2:{obj1,obj2,flag==2}
现在,进行t1.start()的时候,会相继锁d1.obj1,再锁d1.obj2最后System.out.println("my name is t1");进行t2.start()的时候,会相继锁t2.obj1,再锁t2.obj2最后System.out.println("my name is t2")。所以完全不会存在死锁的问题。

而当两个Object为static 时,内存对象将会是
d1:{flag==1}
d2:{flag==2}
{obj1,obj2}
此时,再运行 t1.start(); t2.start();时,obj1和obj2会分别被两个d锁住,从而引发死锁。

PS:所以不知道您为什么理解成“这里如果为实例变量,也并没有创建多个副本哦。”,咱们可以继续探讨哦~
百度网友77560bd
2010-04-01 · TA获得超过276个赞
知道小有建树答主
回答量:402
采纳率:0%
帮助的人:352万
展开全部
线程并发一般来说是相对于单一指令。也是说在使用有限的资源存在的并发关系。

尤其要注意 “有限的资源”
当你俩个object都为static的时候。这个资源就是有限的。因为一直常驻内存,并且只有俩个实例
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式