Bar*_*vbl 4 java multithreading
假设我有这个java代码:
synchronized(someObject)
{
someObject = new SomeObject();
someObject.doSomething();
}
Run Code Online (Sandbox Code Playgroud)
在调用doSomething()时,SomeObject的实例是否仍然被锁定?
线程仍将拥有监视器的原始值,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)
通过首先评估表达式来执行同步语句.
如果表达式的评估由于某种原因突然完成,则同步语句由于同样的原因而突然完成.
否则,如果Expression的值为null,则抛出NullPointerException.
否则,让表达式的非空值为V.执行线程锁定与V关联的锁定.然后执行块.如果块的执行正常完成,则解锁并且synchronized语句正常完成.如果块的执行因任何原因突然完成,则锁定被解锁,然后同步语句突然完成,原因相同.
请注意评估仅发生一次.
| 归档时间: |
|
| 查看次数: |
85 次 |
| 最近记录: |