0

我需要澄清有关块级同步的一些要点。

假设以下同步块位于类的同一方法中:

class A{

some_method(){

//BLOCK1
synchronized(OBJ1){
shared code...
}

//BLOCK2
synchronized(OBJ1){
shared code...
}

//BLOCK3
synchronized(OBJ2){
shared code...
}
}

}

以下查询:

1)如果一个线程通过获取OBJ1的锁进入block1,那么只要第一个线程持有OBJ1的锁,其他线程就不能进入Block2,但其他线程可以同时运行block3,这对吗?

2)第一个线程在完成block1后进入block2是否需要再次获取OBJ1的锁?

3)如果第一个线程从block1调用block2中的一些代码,那么它是否必须释放在第一个块执行期间获得的OBJ1上的锁并再次获得它或者在第一个块期间获得相同的锁会起作用?

现在假设 block1 在一个类的方法中,而 blockk2 和 3 在另一个类的方法中

4) 与第 1 点相同,因为同步是通过获取某个第三类 obj (OBJ1,OBJ2) 的锁定而发生的?

4

3 回答 3

0
  1. 是的,这是正确的。
  2. 是的,因为块在 OBJ1 上同步
  3. 我不明白你的意思。如果您要问的是“锁是可重入的吗?”,那么是的。已经锁定对象的线程可以进入在同一对象上同步的另一个块。
  4. 是的。代码在哪里并不重要。重要的是线程是否有锁。
于 2012-05-19T11:00:41.210 回答
0

1) 是的,如果一个线程持有 OBJ1 锁,那么没有其他线程可以获取相同的锁

2) 是的,需要再次获取锁,因为它会在第 1 块结束时被释放

3) 不,线程不会阻塞它已经持有的锁

4) 是的

于 2012-05-19T11:02:40.087 回答
0

1) 是
2) 是的,因为它在 BLOCK1 之外。

3) 与此相同的嵌套锁定持有(即已经获得)。

现在假设 block1 在一个类的方法中,而 blockk2 和 3 在某个其他类的方法中
>> Ans: 只要锁定对象是内存中的同一个对象,结果就不会不同。

4) 是的

于 2012-05-19T11:13:44.660 回答