黑马程序员技术交流社区
标题:
为什么我的死锁不能触发?
[打印本页]
作者:
☆枫の云
时间:
2014-5-14 09:18
标题:
为什么我的死锁不能触发?
本帖最后由 ☆枫の云 于 2014-5-14 16:15 编辑
请大神看下下面的代码,我没有按照毕老师讲的新建了锁类然后调用
class MyLock
{
static Object locka = new Object();
static Object lockb = new Object();
}
复制代码
就直接在Test中建了两个object的对象充当锁,但是就是锁不住,为什么?求大神解释。
class Test implements Runnable{
private boolean flag;
Object locka = new Object();//建立锁locka
Object lockb = new Object();//建立锁lockb
Test(boolean flag){
this.flag = flag;
}
//除了锁用的和毕老师的不一样,其他都一样,为什么我的死锁就是无法触发。
public void run(){
if(flag){
while(true){
synchronized(locka){
System.out.println(Thread.currentThread().getName()+"if locka");
synchronized(lockb){
System.out.println(Thread.currentThread().getName()+"if lockb");
}
}
}
}else{
while(true){
synchronized(lockb){
System.out.println(Thread.currentThread().getName()+"if lockb");
synchronized(locka){
System.out.println(Thread.currentThread().getName()+"if locka");
}
}
}
}
}
}
class DeadLockTest
{
public static void main(String[] args)
{
Thread t1 = new Thread(new Test(true));
Thread t2 = new Thread(new Test(false));
t1.start();
t2.start();
}
}
复制代码
作者:
skill20
时间:
2014-5-14 09:26
你把锁换Test.class 和 DeadLockTest.class看下效果。
作者:
Tinck
时间:
2014-5-14 09:35
本帖最后由 Tinck 于 2014-5-14 09:43 编辑
锁没有被static修饰,t1和t2各自创建的时候都在自己堆空间里生成a、b锁,所以不存在抢锁的问题。静态后两个锁在方法区里,两个线程都指向同两个锁。
作者:
☆枫の云
时间:
2014-5-14 12:28
Tinck 发表于 2014-5-14 09:35
锁没有被static修饰,t1和t2各自创建的时候都在自己堆空间里生成a、b锁,所以不存在抢锁的问题。静态后两个 ...
原来是这样=.=,相当于各自都有新的锁对象,想了半天没想通,哈哈,O(∩_∩)O谢谢
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2