4

luaj で次のコード スニペットを見つけましたMapが、同期が行われていないため、構築後に行われた変更が他のスレッドに表示されない可能性があるのではないかと疑い始めました。

が final と宣言されているため、構築後に初期化された値が他のスレッドから見えることはわかっていMapますが、その後に発生する変更についてはどうでしょうか。

このクラスはスレッドセーフではないため、マルチスレッド環境で強制を呼び出すと、で無限ループが発生する可能性があることに気付く人もいるかもしれませんHashMapが、私の質問はそれについてではありません。

public class CoerceJavaToLua {
    static final Map COERCIONS = new HashMap(); // this map is visible to all threads after construction, since its final

    public static LuaValue coerce(Object paramObject) {
        ...;
        if (localCoercion == null) {
            localCoercion = ...;
            COERCIONS.put(localClass, localCoercion); // visible?
        }
        return ...;
    }

    ...
}
4

3 に答える 3