2011-04-15 55 views
9

在布赖恩戈茨的书,Java并发在实践中,他重入锁的例子程序是这样的:是否使可重入锁定静态并使其成为互斥锁?

Lock lock = new ReentrantLock(); 

不过,我很想知道,如果改变上述代码:

private static final Lock lock = new ReentrantLock(); 

导致锁现在充当互斥锁,或者如果它不必要和冗余。

因此,如果将锁设为私有,静态和最终,此代码的功能是否会发生变化?

lock.lock(); 
try { 
    //method stuff 
} finally { 
    lock.unlock(); 
} 

谢谢大家提前。 Matt

回答

18

是的。

finalprivate当然没有影响,但static意味着所有实例共享相同的锁。

所以如果你有两个实例,代码块不能同时被两个线程执行。

如果该锁不是静态的,则每个实例都会获得自己的锁。这意味着更多的线程可以同时运行代码(当然,取决于它们的工作方式)。

+0

完美。谢谢。 – 2011-04-15 15:23:56

+1

有关锁与synchronized关键字相关的更多信息,另请参见http://www.ibm.com/developerworks/java/library/j-jtp10264/。 – 2011-07-26 15:26:55

3

创建静态锁被equivallent到

synchronized(MyClass.class){ 

} 

它在本质上是一流水平锁定