Java中同一对象的不同实例上的多线程

Tac*_*0sS 11 java multithreading synchronization race-condition

我已经知道每个类字节码都被加载到内存中一次为每个类加载器,因此当一个线程正在执行某个方法的字节代码,而另一个线程出现?

1个线程 - > 1个实例 - Foo ==没问题.

X个线程 - > 1个实例 - Foo ==需要处理这个很清楚.

X个线程 - > X各个实例 - Foo == ????

我应该确保方法中没有搞砸了吗?如果该方法使用实例级变量,我可以确定它将使用正确的变量吗?

更新:

我看到我的问题并不清楚,这是一个数字的例子

我有一个类型为Foo的对象没有同步!!

我有5个Foo实例,其中每个都运行5个线程,并访问实例级参数,例如:

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
     }
}
Run Code Online (Sandbox Code Playgroud)

我问这里有问题,因为这个类只有1个字节的代码,这个对象的5个实例访问这个字节代码,所以如果我想防止它们在同一个字节代码上重叠,我该怎么办?做?

谢谢,亚当.

Tim*_*der 11

我已经知道每个类字节码都被加载到内存中一次为每个类加载器,因此当一个线程正在执行某个方法的字节代码,而另一个线程出现?

类加载和字节代码在这里无关紧要.字节代码是一组类似于汇编的指令,JVM将其解释并编译为本机机器代码.多个线程可以安全地遵循编码到字节代码中的指令集.

1个线程 - > 1个实例 - 类Test,没问题

大多是正确的.如果只有一个Thread,那么就没有任何线程安全的立即需要.但是,忽略线程安全会限制增长和可重用性.

X线程 - > 1个实例 - 类Test,需要处理这个很清楚.

嗯,是的,出于线程可见性原因并确保关键区域以原子方式执行,使用同步或锁定技术非常重要.当然,这一切都取决于对吗?!如果你的类没有状态(实例或类变量),那么你并不真的需要,使其线程安全的(认为公用事业类像Java的Executors,Arrays,Collections班).

X个线程 - > X个各自的实例 - 类Test,????

如果每个线程都有自己的类Test实例,并且在多个线程中没有共享单个实例,那么这与第一个示例相同.如果两个或多个线程引用了Test实例,那么这与第二个示例相同.

如果该方法使用类级别变量,我可以确定它将使用正确的变量吗?

类变量是staticJava中的变量.已经发布了两个答案,强调了使用synchronized防止多个线程同时修改类变量的重要性.没有提到使用synchronizedvolatile确保您没有看到类变量的陈旧版本的重要性.