我在一个java类中有两个方法,这两个方法都有一个使用相同对象进行同步的代码块。我知道在JAVA同步方案中,线程获取的锁是可重入的。有了这些,我可以放心地说,下面这段代码在所有情况下都不会导致任何问题?
public class Someclass
{
private static final Object LCK_OBJ = new Object();
//.....
publc void method1()
{
//some code....
synchronized(LCK_OBJ)
{
//some sychronized code.
method2(..);
}
//some more code....
}
protected static final void method2(..)
{
Someclass ref = null;
//some code which gets different other references of SomeClass in a loop....
ref.method3(..);
}
publc void method3()
{
//some code....
synchronized(LCK_OBJ)
{
//some sychronized code.
}
//some more code....
}
}//end of class 发布于 2011-04-26 16:50:24
是的,你可以,但是这段代码不会编译:你从一个静态方法"method2“调用一个实例方法"method3”。除此之外:如果线程已经设法获得了"method1“中的锁,那么它仍然会拥有"method3”中的锁。
发布于 2011-04-26 16:48:35
是的,同步的块是可重入的。ReentrantLock也是可重入的,如果你想自己编写代码块,你可能会想要使用它,因为它有更多的灵活性/功能。
我会确保任何锁都是final的。如果一个锁对象不是最终的,那么它几乎肯定是一个bug (或者是混淆的根源)。
为了便于比较,并非Java中的所有锁都是可重入的。FileLock并非如此,因为它将请求直接传递给操作系统。
发布于 2011-04-26 16:47:56
是的,同一个线程可以多次进入同一个锁上的synchronized块。注意不要以不同的顺序获取其他锁,否则可能会导致死锁。
https://stackoverflow.com/questions/5787957
复制相似问题