Mar*_*nov 10 java methods multithreading
我有一个关于Java中多线程方法调用的问题.假设我们有一个单例对象,其类声明如下:
public class SomeClass {
public void someMethod(SomeValueObject object) {
if (object.condition1) {
...
}
if (object.condition2) {
...
}
if (object.condition3) {
...
}
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道这个单例对象是否被同时访问并且它的someMethod使用不同的SomeValueObject实例调用,是否有可能一些随机线程更改对象的引用以进行另一个线程的方法调用并搞乱事情?那么在方法范围内创建的字段呢?我不知道的是,是否为调用该方法的每个线程创建了单独的Method上下文,或者对于调用它的所有线程,Method上下文是否相同?如果是后一种情况,我想我需要synchronized关键字用于线程安全,或者为每个线程使用不同的SomeClass实例(如果我需要更快的执行而不是内存优化).你能帮我解释一下吗?
PS感谢您的所有答案!
JB *_*zet 13
如果一切都是本地的,那么您的方法就是线程安全的.每个线程在堆栈上都有自己的对象参数,它们不会相互干扰.
如果两个线程使用与参数相同的对象调用此方法,或者如果其中两个对象共享某个状态,则可能会出现并发问题,但这不是单例的问题.这是共享状态的问题,必须正确同步.
好的经验法则:无状态对象是线程安全的.具有不可变状态的对象是线程安全的.如果具有可变状态的对象未正确同步对共享状态的访问,则该对象不是线程安全的.
不,线程将无法更改不同线程的局部变量.
在方法的范围[局部变量]中创建的所有变量 - 包括参数都在特定线程的堆栈上分配,因此不在两个线程之间共享.
但是 - 所有类的字段都是不安全的,如果一个线程更改它们 - 它将反映在所有字段中.