单个类加载器中的java.lang.reflect.Field实例是uniq吗?

时间:2013-03-15 10:32:08

标签: java synchronization classloader

我在Field对象中同步了一些java代码。它看起来像:

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

java可以确保每次通过反射得到一个Field对象时,它总是同一个实例吗?所以我可以在它上同步代码块。 我知道它适合Class,但不确定Field。 感谢

1 个答案:

答案 0 :(得分: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
    }
}