一个死锁的实例,关于管程(锁)的疑问。我太晕了。。 本帖最后由 falcon4585 于 2010-07-22 10:30:21 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这里synchronized 关键字是获得对象锁首先A.foo(B)调用的时候就获得了A的锁 在方法返回前不会释放然后B.foo(A)调用的是有会获得B的锁 在返回前也不会释放过了sleep之后 A会调用B.last()方法 由于也是synchronized方法 所以需要获得B的锁B调用A.last()方法也是这样。相当于A和B都拥有自己的锁不释放,又要获得对方的锁,就造成死锁了 1、“每个对象都拥有自己的隐式管程,当对象的同步方法被调用时管程自动载入。”可以理解为这个对象的锁 2、一旦一个线程包含在一个同步方法中,没有其他线程可以调用相同对象的同步方法。由于获得的是对象锁 所以同一时间只能有一个线程访问带synchronized关键字的方法3、“在给定的时间,仅有一个线程可以获得管程。”(既然每个对象都拥有自己的隐式管程为什么不能在同一时间每个线程都进入自己的管程?)你所说的“自己的隐式管程”一个对象只有一个,所有的线程都使用它4、“一个拥有管程的线程如果愿意的话可以再次进入相同的管程。( ”拥有管程不就是在管程里面吗,再次进入怎么理解?)同一线程可以递归获得锁。 不知道这么理解对不对:锁是针对对象的,不是针对方法(我知道这么说不准确)。一个对象中只要有一个synchronized修饰的方法被调用,该对象就会被加锁,再调用该对像里的任何其它synchronized方法都不可以(必须等锁被释放),但调用该对象里的非synchronized方法则不受限制。我原以为synchronized是“锁”方法的,只有访问synchronized方法内部才会受限制,某对象处于syn..方法外的部分可以随意访问。 你理解的没错 有时间可以看看<<java thread>>这本书 JDK问题 请大虾帮帮我 数组问题!!!! jdbc:oracle:oci8 与jdbc:oracle:oci的区别 给一个JInternalframe内部窗口添加代滚动条的JList 请教高手关于Java 多线程同步的问题 java问题,高手进/,10分! Delphi是什么啊? 我写的Filter代码问题: 如何正确安装java plug-in? 请问一下,用字节流从txt里读取一串数字,求质数,在输出到另一个txt里,如何将用空格隔开的数字存入数组中。 为什么从mysql读取图片后乱码 标准答案产生的疑惑
首先A.foo(B)调用的时候就获得了A的锁 在方法返回前不会释放
然后B.foo(A)调用的是有会获得B的锁 在返回前也不会释放过了sleep之后 A会调用B.last()方法 由于也是synchronized方法 所以需要获得B的锁
B调用A.last()方法也是这样。相当于A和B都拥有自己的锁不释放,又要获得对方的锁,就造成死锁了
可以理解为这个对象的锁 2、一旦一个线程包含在一个同步方法中,没有其他线程可以调用相同对象的同步方法。
由于获得的是对象锁 所以同一时间只能有一个线程访问带synchronized关键字的方法3、“在给定的时间,仅有一个线程可以获得管程。”(既然每个对象都拥有自己的隐式管程为什么
不能在同一时间每个线程都进入自己的管程?)
你所说的“自己的隐式管程”一个对象只有一个,所有的线程都使用它4、“一个拥有管程的线程如果愿意的话可以再次进入相同的管程。( ”拥有管程不就是在管程里面吗,
再次进入怎么理解?)
同一线程可以递归获得锁。
锁是针对对象的,不是针对方法(我知道这么说不准确)。一个对象中只要有一个synchronized修饰的方法被调用,该对象就会被加锁,再调用该对像里的任何其它synchronized方法都不可以(必须等锁被释放),但调用该对象里的非synchronized方法则不受限制。
我原以为synchronized是“锁”方法的,只有访问synchronized方法内部才会受限制,某对象处于syn..方法外的部分可以随意访问。
有时间可以看看<<java thread>>这本书