Java 示例SyncService中sSyncAdapterLock的用途是什么?
我能找到的所有示例SyncService代码似乎都没有完全同步或不必要地同步 下面的典型代码在创建singleton实例时使用静态锁Java 示例SyncService中sSyncAdapterLock的用途是什么?,java,android,multithreading,concurrency,Java,Android,Multithreading,Concurrency,我能找到的所有示例SyncService代码似乎都没有完全同步或不必要地同步 下面的典型代码在创建singleton实例时使用静态锁 public class SyncService extends Service { private static final Object sSyncAdapterLock = new Object(); private static SyncAdapter sSyncAdapter = null; @Override public void
public class SyncService extends Service {
private static final Object sSyncAdapterLock = new Object();
private static SyncAdapter sSyncAdapter = null;
@Override
public void onCreate() {
synchronized (sSyncAdapterLock) {
if (sSyncAdapter == null) {
sSyncAdapter = new SyncAdapter(getApplicationContext(), false);
}
}
}
@Override
public IBinder onBind(Intent intent) {
return sSyncAdapter.getSyncAdapterBinder();
}
}
资料来源:
这段代码有两个奇怪的地方:
onCreate
可以(理论上)由Android运行时在两个不同的SyncService
实例上并行调用。锁确保您只创建一个静态的SyncAdapter
我有同样的问题,我相信答案是这个示例代码中的同步是错误的。总是在主线程上调用YesonCreate
,因此不需要同步。此外,即使多个线程可以同时调用onBind
,在onCreate
完成之前,也不会调用该方法。因此,在这个示例代码中根本不需要任何同步。我不相信有一个理论允许这样做。onCreate始终在主应用程序线程上调用。Service#onCreate始终在startCommand或onBind(也在流程主线程中调用)之前在流程主线程中调用。如果需要这个锁,那么onBind中就需要一个相应的锁,但是没有。嘿,你的问题有答案了吗?如果是,请邮寄