0

我正在研究LunarViewJava Lunar Lander 示例(API-8 版本)的一些代码。我注意到了这个奇怪的地方:

public synchronized void restoreState(Bundle savedState) {
            synchronized (mSurfaceHolder) {
                        // ...
            }
}

为什么要双同步?第一次同步不是已经保证一次只有一个线程可以进入这个方法吗?

4

1 回答 1

0

不。

内部同步块锁定到 mSurfaceHolder 对象,而在方法上使用同步关键字锁定到类实例本身。

synchronized 关键字基本上就像在实例对象上使用锁..

public synchronized void doSomething()
{
    // Do some stuff
}

和...完全一样

public void doSomething()
{
    synchronized (this)
    {
        // Do some stuff
    }
}

锁定到一个对象意味着如果一段同步代码正在执行,并且锁定了一个特定的对象,那么任何其他同步的代码(使用相同的对象作为锁定)将不得不等到第一个完成。

于 2013-03-28T23:13:09.570 回答