1

Field オブジェクトで同期された Java コードがいくつかあります。次のようになります。

Field f = SomeClass.class.getDeclaredField("field1");
synchronized(f) {
  ....
}

Java は、リフレクションによって Field オブジェクトを取得するたびに、常に同じインスタンスであることを保証できますか? そのため、コードブロックを同期できます。クラスは問題ないことはわかっていますが、フィールドについてはわかりません。ありがとう

4

1 に答える 1

3

この単純な例は、同じインスタンスではないことを示しています (false と表示されます)。Fieldとにかくオブジェクトを同期したいのはなぜですか? 基礎となる変数をロックすることと同等ではないことに気付いたと思います。

確かにもっと良いオプションがあるので、なぜそれをしたいのかを説明する必要があります。

class Test {

    int i;

    public static void main(String[] args) throws Exception {
        Class c = Test.class;
        Field f1 = c.getDeclaredField("i");
        Field f2 = c.getDeclaredField("i");
        System.out.println(f1 == f2); //prints false
    }
}
于 2013-03-15T10:38:03.700 に答える