为了账号安全,请及时绑定邮箱和手机立即绑定

死锁和静态对象问题?

死锁和静态对象问题?

湖上湖 2019-05-23 17:16:07
如题所示,o1和o2申明为静态对象就可产生死锁,那非静态为什么不可以?我所理解的静态对象:在内存空间只存在一份;如果申明非静态是不是Locklock1=newLock(1);Locklock2=newLock(2);lock1和lock2中都存在o1和o2?publicclassLockimplementsRunnableprivateintflag;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对象锁");}}}}}
查看完整描述

2 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

你最后说的是对的,如果非静态,lock1和lock2中都存在o1和o2,o1和o2分别有2份,是不同的对象。
静态成员变量,简单理解就是这个类所有对象都可以访问的全局变量,类加载的时候就会把这个对象创建出来。
                            
查看完整回答
反对 回复 2019-05-23
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

静态锁的是字节码只有一份非静态锁的对象的成员变量每一个对象不同,成员变量也不同所以有多份
所以你最后说的是没问题的非静态中的lock1lock2中都有各自的o1o2
                            
查看完整回答
反对 回复 2019-05-23
  • 2 回答
  • 0 关注
  • 373 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信