当一个对象被锁定,并且该对象被替换时,是否保持了锁?

Bar*_*vbl 4 java multithreading

假设我有这个java代码:

synchronized(someObject)
{
    someObject = new SomeObject();
    someObject.doSomething();
}
Run Code Online (Sandbox Code Playgroud)

在调用doSomething()时,SomeObject的实例是否仍然被锁定?

Jon*_*eet 5

线程仍将拥有监视器的原始值,someObject直到同步块结束.如果你能想象,有两种方法,Monitor.enter(Object)Monitor.exit(Object)随后synchronized块将采取行动是这样的:

SomeObject tmp = someObject;
Monitor.enter(tmp);
try
{
    someObject = new SomeObject();
    someObject.doSomething();
}
finally
{
    Monitor.exit(tmp);
}
Run Code Online (Sandbox Code Playgroud)

JLS第14.19节:

通过首先评估表达式来执行同步语句.

如果表达式的评估由于某种原因突然完成,则同步语句由于同样的原因而突然完成.

否则,如果Expression的值为null,则抛出NullPointerException.

否则,让表达式的非空值为V.执行线程锁定与V关联的锁定.然后执行块.如果块的执行正常完成,则解锁并且synchronized语句正常完成.如果块的执行因任何原因突然完成,则锁定被解锁,然后同步语句突然完成,原因相同.

请注意评估仅发生一次.