web-dev-qa-db-ja.com

この同期はサービスonCreateメソッドで必要ですか?

以下は私がキャプチャしたサンプルコードです Android doc

サービスインスタンスごとに、onCreateは1回だけ呼び出されます。参照: ここ および ここ

この状況では、同期とシングルトンは私には意味がありません。ごく最近、私はグーグルドキュメントで別の質問をしました ここ

これが再び間違っている場合は、おそらく私は自分自身を彼らの文書から呼び出し規約を取り、彼らの論理を無視するように制限する必要があります。

コミュニティでGoogleドキュメントをすばやく続けて実行して申し訳ありません。私はこれらの文書からどれだけ取るべきかについて自分自身を正したいと思っています。

public class SyncService extends Service {
    // Storage for an instance of the sync adapter
    private static SyncAdapter sSyncAdapter = null;
    // Object to use as a thread-safe lock
    private static final Object sSyncAdapterLock = new Object();
    /*
     * Instantiate the sync adapter object.
     */
    @Override
    public void onCreate() {
        /*
         * Create the sync adapter as a singleton.
         * Set the sync adapter as syncable
         * Disallow parallel syncs
         */
        synchronized (sSyncAdapterLock) {
            if (sSyncAdapter == null) {
                sSyncAdapter = new SyncAdapter(getApplicationContext(), true);
            }
        }
    }
2
Saran

これは必要である。 sSyncAdapterはSTATIC変数であることに注意してください。

これは、オブジェクトのインスタンスごとに1つではなく、アプリケーションごとに1つあることを意味します。

2つ(またはそれ以上)のSyncServiceオブジェクトが同時に作成される状況を考えてみます。その場合、競合が発生し、2つのSyncAdapterオブジェクトが作成される可能性があります(1つはsSyncAdapterに割り当てられていないぶら下がり参照)。

AND-アプリケーションの外部ロジックが2つのSyncServiceを同時に作成できない場合でも、ロックには別の理由があります。 sSyncAdapterへの割り当てを他のスレッドに「公開」するメモリバリアを作成します。 sSyncAdapterにアクセスする他の(スレッド化された)コードがあると思います。ロック/ロック解除は、プロセッサのキャッシュ管理にデータをフラッシュさせて他のスレッドに表示されるようにするために必要です。

1
Lewis Pringle