我有一个关于静态方法的 java 同步的问题。
更准确地说,我有一个带有静态方法的类,可以由多个线程同时使用。我的类的主要静态方法有一个参数,并依次调用其他辅助静态方法并将该参数传递给它们。
我的问题如下:由于该类可以同时被多个线程使用,是否存在另一个线程替换另一个线程的参数的风险?
我曾想过在主函数的参数变量上使用同步块(synchronized block),包含方法的整个代码(因此也调用辅助函数),但我不确定这是一个好的解决方案。
有人可以帮助我吗?
最佳答案
My question is the following: since the class can be used by multiple threads at a time, isn't there a risk that another thread replaces the argument by another one?
不,没有。您混淆了静态
和堆栈存储。
static int x;
static void someMethod(int y1, SomeObject y2) {
int z;
...
}
在线程情况下,所有线程都访问相同的字段x
。您需要担心该字段的同步。但是,即使 someMethod(...)
是一个 static
方法,y1
参数和 z
方法字段对于调用线程来说是本地的。其他线程无法访问该内存,因为它位于线程的调用堆栈上。
异常(exception)是参数y2
,因为它是一个对象。 Java 是按值传递的,而基元是在堆栈上传递的。但是,当您按值传递对象时,您会传递其引用,因此两个线程可以传递相同的对象引用,并且您需要担心那里的同步。
顺便说一句,尽管确实允许,但在线程之间调用静态方法并不是最好的模式。如果可能的话,实例是可行的方法。它们可以共享静态常量字段等,但从其他 static
方法调用各种 static
方法听起来过于困惑。
关于java - 静态方法参数的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22645621/