2012-05-19 54 views
0

我需要清除块级同步的一些要点。块级同步

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

class A{ 

some_method(){ 

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

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

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

} 

以下查询:

1)这是正确的,如果一个线程进入由上OBJ1获得锁BLOCK1,那么只要第一个线程在OBJ1上保持锁定,其他线程就可以同时运行块3,否则没有其他线程可以进入块2。

2)如果在完成block1之后进入block2,第一个线程是否需要再次获得OBJ1的锁定? 3)如果第一个线程在block2中调用一些代码,从block1开始,那么它将不得不释放第一个block执行期间获得的OBJ1上的锁定,并再次获取它,或者第一个block中获得的同一个锁定将会工作?

现在假定BLOCK1是在一类和blockk2的方法和图3是在其它的类

4)相同的方法如点1保持为同步真正是通过在一些获得锁发生第三类obj(OBJ1,OBJ2)?

+0

是这个家庭作业? – mata

+2

[Java教程:同步方法](http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html) – matthewnreid

回答

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

1)是的,如果一个线程持有OBJ1锁定,则没有其他线程可以获取同样的锁

2)是的,把锁需要,因为它会一直在年底发布再次被收购块的1

3)否,一个线程不会上的锁块,它已持有

4)是

0

1)YES
2)是,因为我t在BLOCK1之外。

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

现在假定BLOCK1是在一类和blockk2的方法和图3是在其它的类
>>答的方法,包括:作为锁定对象是相同的结果将不会远不同对象在内存中。

4)是