1

最初に、私は次の(ここでは単純化された)クラスを持っていました:

public class MyClass {

    private static Map<String, Object> objects = new HashMap<String, Object>();

    public static Object get(String key) {
        return objects.get(key);
    }

    public static void set(String key, Object object) {
        objects.put(key, object);
    }

}

それから、私はそれをtreahsafeにしたかったので、私は次のsynchronizedようにキーワードを試しました:

public class MyClass {

    private static Map<String, Object> objects = new HashMap<String, Object>();

    public static synchronized Object get(String key) {
        return objects.get(key);
    }

    public static synchronized void set(String key, Object object) {
        objects.put(key, object);
    }

}

問題は、synchronized私の場合はキーワードで十分か、それともキーワードを追加する必要があるかということvolatileです。

public class MyClass {

    private static volatile Map<String, Object> objects = new HashMap<String, Object>();

    public static synchronized Object get(String key) {
        return objects.get(key);
    }

    public static synchronized void set(String key, Object object) {
        objects.put(key, object);
    }

}

4

3 に答える 3

4

揮発objects性にすることは、再割り当てした場合にのみ影響しますobjects。あなたの例ではそうしないので、違いはなく、不要です。

objectsファイナルを作成して「再割り当て不可」を適用することをお勧めします。

あなたの場合、スレッドセーフマップの実装を使用してスレッドセーフを委任することができます(同期された実装よりも確実にスケーリングします)。

于 2013-01-25T16:22:31.987 に答える
3

volatileコードスレッドを魔法のように安全にするわけではありません。JVMがマルチスレッドコンテキストに関連しない最適化を実行するのを防ぐためだけです(さらに悪いことに、プログラムが期待どおりに実行されるのを防ぎます)。

代わりにConcurrentHashMapを確認することをお勧めします。これは、あなたの場合に役立つ可能性があります。

于 2013-01-25T16:24:08.453 に答える
0

に格納されている参照を変更していないため、キーワードobjectsを使用しても意味がありません。volatile

于 2013-01-25T16:22:36.853 に答える