我有一个关于
Java中多线程方法调用的问题.假设我们有一个单例对象,它的类声明如下:
public class SomeClass {
public void someMethod(SomeValueObject object) {
if (object.condition1) {
...
}
if (object.condition2) {
...
}
if (object.condition3) {
...
}
}
}
我想知道如果这个单例对象是被同时访问的,并且它的someMethod用不同的SomeValueObject实例调用,有没有机会一些随机线程改变对象引用的另一个线程的方法调用和搞乱事情?那么在方法范围内创建的字段呢?
我不知道的是,是否为每个调用该方法的线程创建了任何单独的方法上下文,或者所有调用它的线程的方法上下文是相同的?如果是后一种情况,我想我需要线程安全的synchronized关键字,或者为每个线程使用不同的SomeClass实例(如果我需要更快的内存优化执行).请你解释一下我的问题
附:感谢你们所有的答案!
解决方法
如果一切都是本地的,那么你的方法是线程安全的.每个线程在堆栈上都有自己的对象参数,它们不会互相干扰.
如果两个线程使用与参数相同的对象调用此方法,或者其中两个对象共享一些状态,则可能会出现并发问题,但这不是单例的问题.这是共享状态的问题,必须正确同步.
良好的经验法则:无状态对象是线程安全的.具有不可变状态的对象是线程安全的.如果不正确地同步访问共享状态,则具有可变状态的对象不是线程安全的.