我正在研究Java Lunar Lander示例(API-8版本)的一些LunarView
代码。我注意到了这个奇怪的现象:
public synchronized void restoreState(Bundle savedState) {
synchronized (mSurfaceHolder) {
// ...
}
}
为什么是双同步?first synchronize不是已经保证一次只能有一个线程进入这个方法吗?
发布于 2013-03-29 07:13:10
不是的。
内部synchronized块锁定在mSurfaceHolder对象上,而在方法上使用synchronized关键字则锁定在类实例本身。
synchronized关键字基本上类似于在instance对象上使用锁。
public synchronized void doSomething()
{
// Do some stuff
}
和……完全一样。
public void doSomething()
{
synchronized (this)
{
// Do some stuff
}
}
锁定到一个对象意味着如果一段同步的代码在执行时锁定了一个特定的对象,那么任何其他同步的代码段(使用相同的对象作为锁)将不得不等待,直到第一个同步代码段完成。
https://stackoverflow.com/questions/15693559
复制相似问题