猿问

死锁和静态对象问题?

如题所示,o1和o2申明为静态对象就可产生死锁,那非静态为什么不可以?我所理解的静态对象:在内存空间只存在一份;如果申明非静态是不是Locklock1=newLock(1);Locklock2=newLock(2);lock1和lock2中都存在o1和o2?
publicclassLockimplementsRunnable
privateintflag;
publicLock(intflag){
this.flag=flag;
}
//**?**
staticObjecto1=newObject();
staticObjecto2=newObject();
publicstaticvoidmain(String[]args){
Locklock1=newLock(1);
Locklock2=newLock(2);
newThread(lock1).start();
newThread(lock2).start();
}
publicvoidrun(){
System.out.println("flag="+flag);
if(flag==1){
synchronized(o1){
System.out.println("已持有O1对象锁.");
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
synchronized(o2){
System.out.println("持有O2对象锁");
}
}
}elseif(flag==2){
synchronized(o2){
System.out.println("已持有O2对象锁.");
try{
Thread.sleep(1000);
}catch(InterruptedExceptione){
e.printStackTrace();
}
synchronized(o1){
System.out.println("持有O1对象锁");
}
}
}
}
}
湖上湖
浏览 374回答 2
2回答

一只甜甜圈

你最后说的是对的,如果非静态,lock1和lock2中都存在o1和o2,o1和o2分别有2份,是不同的对象。静态成员变量,简单理解就是这个类所有对象都可以访问的全局变量,类加载的时候就会把这个对象创建出来。

斯蒂芬大帝

静态锁的是字节码只有一份非静态锁的对象的成员变量每一个对象不同,成员变量也不同所以有多份所以你最后说的是没问题的非静态中的lock1lock2中都有各自的o1o2
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答