k****r 发帖数: 807 | 1 这个死锁的例子,为什么会发生呢?bow里面的bower.bowBack(this)为什么会被block
住呢,不是两个bow function都synchronized了吗?难道说instance的另一个bowBack
也被syn了吗?
concurrency小白,勿怪。
static class Friend {
private final String name;
public Friend(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
public synchronized void bow(Friend bower) {
System.out.format("%s: %s"
+ " has bowed to me!%n",
this.name, bower.getName());
bower.bowBack(this);
}
public synchronized void bowBack(Friend bower) {
System.out.format("%s: %s"
+ " has bowed back to me!%n",
this.name, bower.getName());
}
}
public static void main(String[] args) {
final Friend alphonse =
new Friend("Alphonse");
final Friend gaston =
new Friend("Gaston");
new Thread(new Runnable() {
public void run() { alphonse.bow(gaston); }
}).start();
new Thread(new Runnable() {
public void run() { gaston.bow(alphonse); }
}).start();
} |
z****e 发帖数: 54598 | 2 static class?
为什么用这个?
这个你不写我估计都忘了 |
j*****8 发帖数: 3635 | 3 这个不是oracle tutorial里给的例子吗
synchronized 是随instance的
这个例子里每个人hold自己的lock,然后试图获取对方的lock,所以就悲剧了
block
bowBack
【在 k****r 的大作中提到】 : 这个死锁的例子,为什么会发生呢?bow里面的bower.bowBack(this)为什么会被block : 住呢,不是两个bow function都synchronized了吗?难道说instance的另一个bowBack : 也被syn了吗? : concurrency小白,勿怪。 : static class Friend { : private final String name; : public Friend(String name) { : this.name = name; : } : public String getName() {
|
k****r 发帖数: 807 | 4 原来是这样啊,也只有这样才能发生死锁了。
所以,可以这样认为吗?因为class的定义是用了static,sync才随着instance走的吗?
如果没用static呢?
【在 j*****8 的大作中提到】 : 这个不是oracle tutorial里给的例子吗 : synchronized 是随instance的 : 这个例子里每个人hold自己的lock,然后试图获取对方的lock,所以就悲剧了 : : block : bowBack
|
j*****8 发帖数: 3635 | 5 和那没关系
要是synchronize static method 的话,就跟着class 走了
吗?
【在 k****r 的大作中提到】 : 原来是这样啊,也只有这样才能发生死锁了。 : 所以,可以这样认为吗?因为class的定义是用了static,sync才随着instance走的吗? : 如果没用static呢?
|
k****r 发帖数: 807 | 6 那为什么在一个class里面,两个function分别sync呢?是只要进入一个function,其
他想用当前的instance的都会被block吗?
我之前一直以为就是当前的method会被lock。
【在 j*****8 的大作中提到】 : 和那没关系 : 要是synchronize static method 的话,就跟着class 走了 : : 吗?
|