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便不会发生死锁。类变量在内存中只有一个副本,实例变量每创建一个实例便产生一个副本。这里如果为实例变量,也并没有创建多个副本哦。有些不太明白,望各位指教! 展开
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便不会发生死锁。类变量在内存中只有一个副本,实例变量每创建一个实例便产生一个副本。这里如果为实例变量,也并没有创建多个副本哦。有些不太明白,望各位指教! 展开
展开全部
这里如果不为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:所以不知道您为什么理解成“这里如果为实例变量,也并没有创建多个副本哦。”,咱们可以继续探讨哦~
因为如果不为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:所以不知道您为什么理解成“这里如果为实例变量,也并没有创建多个副本哦。”,咱们可以继续探讨哦~
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询