块级同步

时间:2012-05-19 10:52:02

标签: java multithreading synchronization

我需要清楚一些关于块级同步的要点。

假设以下同步块在类的相同方法

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)如果第一个线程调用block2中的某些代码,则从block1开始,它必须在第一个块执行期间释放对OBJ1获取的锁定并再次获取它或者在第一个块期间获得相同的锁定将起作用吗?

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

4)与第1点相同,因为在某些第三类obj(OBJ1,OBJ2)上获得锁定会发生同步吗?

3 个答案:

答案 0 :(得分:0)

  1. 是的,这是对的。
  2. 是的,因为该块在OBJ1上同步
  3. 我不明白你的意思。如果你问的是“锁是否可以重入?”,那么是的。已经锁定对象的线程可以进入同一对象上同步的另一个块。
  4. 是。代码在哪里无关紧要。重要的是线程是否有锁定。

答案 1 :(得分:0)

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

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

3)不,线程不会阻塞它已经存在的锁

4)是的

答案 2 :(得分:0)

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

3)相同的锁保持(即已经获得)嵌套锁定就像这一个。

  
    

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

  

4)是的