【发布时间】:2011-03-07 03:23:36
【问题描述】:
我了解到每个类加载器都会将每个类字节码加载到内存中一次,因此当一个线程正在执行某个方法的字节码时,另一个线程会出现?
1 线程 -> 1 实例 - 类 Foo ==没问题。
X 线程 -> 1 实例 - 类 Foo == 需要处理 这很清楚.
X 个线程 -> X 个相应 实例 - 类 Foo == ??? ?
我应该确保方法中没有任何问题吗? 如果该方法使用 instance 级别的变量,我可以确定它会使用正确的吗?
更新:
我发现我的问题有些人不清楚,这里有一个数字示例
我有一个类类型为 Foo 的对象,它没有同步!!
我有 5 个该 Foo 实例,每个实例中运行 5 个线程,并访问 instance 级参数,例如:
class FOO {
private SomeObject someObject=new SomeObject();
private void problematicMethod(Data data) {
someObject.doSomethingWithTheData(data);
data.doSomethingWithSomeObject(someObject);
// any way you want it use the data or export the data
}
}
我问这里有没有问题,因为这个类只有 1 个字节码和这个对象的 5 个实例可以访问这个字节码,所以如果我想防止它们在同一个字节码上重叠,我该怎么办?
谢谢, 亚当。
【问题讨论】:
-
您需要提供更多信息。 X 个实例是同一个类吗?是否同时对多个实例进行原子操作?具体情况如何?
-
当然,如果不这样,这个问题的意义何在?
-
如果每个线程都有自己的
Test类实例,并且你保证一个线程永远不会访问其他线程的实例,那么对实例级成员的访问不需要同步。您仍然必须同步对类级别成员的访问(正如我在回答中所说的那样),因为任何时候只有一个类并且它在所有线程之间共享。 -
回顾三年...我对多线程的了解如此之多,这让这个问题看起来很有趣...但我仍然相信对于这些人来说这是一个不平凡的问题像我以前一样没有经验!
标签: java multithreading synchronization race-condition