gpt4 book ai didi

java - 在线程之间传递对象时是否可以使用 instanceof?

转载 作者:太空狗 更新时间:2023-10-29 23:02:36 26 4
gpt4 key购买 nike

我遇到了 instanceof 工作的问题,然后它不工作。进入细节是困难的,但我认为这可能是问题所在:

正在阅读:http://www.theserverside.com/news/thread.tss?thread_id=40229 (搜索 Thread.currentThread),这似乎暗示,即使这两个对象是同一个类,如果你在具有不同类加载器的线程之间传递它们,instanceof(和 isAssignableFrom)可能仍然会失败。

这当然可以解释我的行为,但我想知道是否有人可以验证它?

(我希望在讨论开始时链接的文章仍然可用,但它似乎不是。)

最佳答案

这与线程无关,只与类加载器有关。相同的类定义,当由不同的类加载器加载时,被 JVM 视为两个不同的类。因此 instanceof 或两者之间的转换失败。

所以回答你原来的问题:在线程之间传递对象由同一个类加载器加载是安全的,instanceof等。工作正常。

这是一个 article about class loading issues .

另见 this earlier answer of mine一种验证游戏中有哪些类加载器的方法。

更新 Romain 的评论

下面是一些测试 instanceof 行为的代码,其中包括:

URL[] urls = new URL[] {new File("build/classes/").toURL()};
ClassLoader loader1 = new URLClassLoader(urls, null);
ClassLoader loader2 = new URLClassLoader(urls, null);
Class<?> c1 = loader1.loadClass("net.torokpeter.Foo");
Class<?> c2 = loader2.loadClass("net.torokpeter.Foo");
Object foo1 = c1.newInstance();
Object foo2 = c2.newInstance();

System.out.println("c1.toString(): " + c1);
System.out.println("c2.toString(): " + c2);
System.out.println("c1.equals(c2): " + c1.equals(c2));
System.out.println("c1 == c2: " + (c1 == c2));
System.out.println("foo1: " + foo1);
System.out.println("foo2: " + foo2);
System.out.println("foo1 instanceof Foo: " + (foo1 instanceof Foo));
System.out.println("foo2 instanceof Foo: " + (foo2 instanceof Foo));
System.out.println("c1.isAssignableFrom(c1): " + c1.isAssignableFrom(c1));
System.out.println("c2.isAssignableFrom(c2): " + c2.isAssignableFrom(c2));
System.out.println("c1.isAssignableFrom(c2): " + c1.isAssignableFrom(c2));
System.out.println("c2.isAssignableFrom(c1): " + c2.isAssignableFrom(c1));
System.out.println("c1.isAssignableFrom(Foo.class): " + c1.isAssignableFrom(Foo.class));
System.out.println("c2.isAssignableFrom(Foo.class): " + c2.isAssignableFrom(Foo.class));
System.out.println("Foo.class.isAssignableFrom(c1): " + Foo.class.isAssignableFrom(c1));
System.out.println("Foo.class.isAssignableFrom(c2): " + Foo.class.isAssignableFrom(c2));

输出是(在 Eclipse、Java5 中):

c1.toString(): class net.torokpeter.Foo
c2.toString(): class net.torokpeter.Foo
c1.equals(c2): false
c1 == c2: false
foo1: net.torokpeter.Foo@360be0
foo2: net.torokpeter.Foo@45a877
foo1 instanceof Foo: false
foo2 instanceof Foo: false
c1.isAssignableFrom(c1): true
c2.isAssignableFrom(c2): true
c1.isAssignableFrom(c2): false
c2.isAssignableFrom(c1): false
c1.isAssignableFrom(Foo.class): false
c2.isAssignableFrom(Foo.class): false
Foo.class.isAssignableFrom(c1): false
Foo.class.isAssignableFrom(c2): false

所以一切似乎都是一致的:-)

关于java - 在线程之间传递对象时是否可以使用 instanceof?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3026127/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com