10

Android システム用のネイティブ共有ライブラリ (.so) を実装しようとしています。当然ながら、スレッドセーフにする必要があるコード ブロックがいくつかあります。ここで、pthreads ロック、mutex、または条件変数がサポートされていないこと

がわかりました。 スレッドセーフを実現するためにライブラリレベルで通常使用されるものを知りたいですか?

4

3 に答える 3

4

これを実現する方法は、Java レベルのスレッドがアクセスするときにスレッド セーフにするか、ネイティブ スレッドを Java スレッドと同期する必要があるかによって異なります。

Java レベルのスレッドのみを同期するには、次の 2 つの方法があります。

1. 最も簡単な方法は、複数のスレッドからアクセスされるネイティブ メソッドにsynchronizedキーワードを追加することです。

public native synchronized int sharedAccess();

2.ネイティブ側からの同期:

(*env)->MonitorEnter(env, obj);
...                      /* synchronized block */
(*env)->MonitorExit(env, obj);

ネイティブ スレッドを Java スレッドと同期する方法については、こちらを参照してください。

于 2015-08-30T05:45:41.300 に答える
0

スレッドセーフなシングルトンを使用できます。シングルトンはすべて悪いので、これはスレッドセーフなアトミック操作のあまり一般的な方法ではありませんが(したがって、多くの賛成票は期待できません)。それは高速で軽量であり、今でも機能します。smalltalk で頻繁に使用され、Java で一時的に使用され、主要な設計パターンと見なされていました。

public class ThreadSafeSingleton {

    private static final Object instance = new Object();

    protected ThreadSafeSingleton() {
    }

    // Runtime initialization

    public static Object getInstance() {
        return instance;
    }
}

これは遅延ロードされたバージョンです...

public class LazySingleton {
    private Singleton() {
    }

    private static class LazyInstance {
        private static final Singleton INSTANCE = new Singleton();
    }
        // Automatically ThreadSafe
    public static Singleton getInstance() {
        return LazyInstance.INSTANCE;
    }
}

詳細については、Java のスレッド セーフ シングルトンに関するこの投稿を参照してください。

于 2015-09-05T00:29:32.870 に答える