2013-11-25 18 views
4

我可以找到的所有示例SyncService代碼都顯示爲不完全或不必要地同步。示例SyncService中sSyncAdapterLock的用途是什麼?

下面的典型代碼在創建單例實例時使用靜態鎖。

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(); 
    } 
} 

來源:http://developer.android.com/training/sync-adapters/creating-sync-adapter.html

兩個有關此代碼的奇怪的事情是:

  1. 爲什麼鎖甚至需要?不是總是在主應用程序線程上調用onCreate()?

  2. 如果在onCreate()中需要鎖定,爲什麼不用這個鎖來訪問onBind()中的實例? FindBugs將其標記爲50%同步。

+0

嘿,你得到了你的問題的答案?如果是的話請發帖 –

回答

0

我有同樣的問題,我相信答案是這個示例代碼中的同步是錯誤的。總是在主線程上調用onCreate,所以不需要同步。此外,即使多個線程同時調用onBind,該方法在onCreate完成之後纔會被調用。因此在這個示例代碼中根本不需要任何同步。

0

onCreate可(在理論上)並行地對由所述的Android運行時的SyncService兩個不同的實例被調用。鎖確保你真的只創建一個單一的靜態SyncAdapter

+0

我不相信有一個理論允許這樣做。 onCreate總是在主應用程序線程上調用。 –

+0

Service#onCreate總是在startCommand或onBind(也在進程主線程中調用)之前的進程主線程中調用。如果需要這個鎖,那麼在onBind中需要相應的鎖,但是沒有。 –