Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 示例SyncService中sSyncAdapterLock的用途是什么?_Java_Android_Multithreading_Concurrency - Fatal编程技术网

Java 示例SyncService中sSyncAdapterLock的用途是什么?

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

我能找到的所有示例SyncService代码似乎都没有完全同步或不必要地同步

下面的典型代码在创建singleton实例时使用静态锁

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()是否总是在主应用程序线程上调用

  • 如果onCreate()中需要锁,为什么不使用此锁访问onBind()中的实例?FindBugs将此标记为50%已同步


  • onCreate
    可以(理论上)由Android运行时在两个不同的
    SyncService
    实例上并行调用。锁确保您只创建一个静态的
    SyncAdapter

    我有同样的问题,我相信答案是这个示例代码中的同步是错误的。总是在主线程上调用Yes
    onCreate
    ,因此不需要同步。此外,即使多个线程可以同时调用
    onBind
    ,在
    onCreate
    完成之前,也不会调用该方法。因此,在这个示例代码中根本不需要任何同步。

    我不相信有一个理论允许这样做。onCreate始终在主应用程序线程上调用。Service#onCreate始终在startCommand或onBind(也在流程主线程中调用)之前在流程主线程中调用。如果需要这个锁,那么onBind中就需要一个相应的锁,但是没有。嘿,你的问题有答案了吗?如果是,请邮寄