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实例,那么这与第二个示例相同.
如果该方法使用类级别变量,我可以确定它将使用正确的变量吗?
类变量是static
Java中的变量.已经发布了两个答案,强调了使用synchronized
防止多个线程同时修改类变量的重要性.没有提到使用synchronized
或volatile
确保您没有看到类变量的陈旧版本的重要性.
归档时间: |
|
查看次数: |
23177 次 |
最近记录: |