我正在研究Java Lunar Lander示例(API-8版本)的一些LunarView
代码。我注意到这个奇怪之处:</ p>
public synchronized void restoreState(Bundle savedState) {
synchronized (mSurfaceHolder) {
// ...
}
}
为什么要双同步?第一次同步是否已经保证只有一个线程可以一次输入这个方法?
答案 0 :(得分:0)
没有
内部同步块锁定到mSurfaceHolder对象上,而方法上的synchronized关键字的使用锁定在类实例本身上。
synchronized关键字基本上就像在实例对象上使用锁..
public synchronized void doSomething()
{
// Do some stuff
}
与...完全相同。
public void doSomething()
{
synchronized (this)
{
// Do some stuff
}
}
锁定到一个对象意味着如果一条同步代码正在执行一个特定对象的锁定,那么任何其他同步的代码片段(使用相同的锁定对象)将不得不等到第一个饰面。