我有一个关于java与静态方法同步的问题。
更确切地说,我有一个带有静态方法的类,可以由多个线程同时使用。我的类的主要静态方法有一个参数,并且一个接一个地调用其他辅助静态方法。
我的问题如下:由于该类一次可以由多个线程使用,是否存在另一个线程用另一个线程替换该参数的风险?
我曾想过在我的主函数的参数变量上使用同步块,包含方法的整个代码(以及对辅助函数的调用),但我不确定它是一个好的解决方案
有人可以帮助我吗?
答案 0 :(得分:2)
我的问题如下:由于该类一次可以由多个线程使用,是否存在另一个线程用另一个线程替换该参数的风险?
不,没有。您混淆了static
和堆栈存储。
static int x;
static void someMethod(int y1, SomeObject y2) {
int z;
...
}
在线程情况下,所有线程都访问相同的字段x
。您需要担心该字段的同步。但是,即使someMethod(...)
是static
方法,y1
参数和z
方法字段也是调用线程的本地字段。其他线程无法访问该内存,因为它位于线程的调用堆栈中。
对此的例外是参数y2
,因为它是一个对象。 Java按值传递,原语在堆栈上传递。但是,当您按值传递对象时,您传递其引用,以便两个线程可以传递相同的对象引用,您需要担心那里的同步。
顺便说一下,虽然当然允许在线程之间调用静态方法并不是最好的模式。如果可能的话,实例是可行的方法。它们可以共享静态常量字段等,但从其他static
方法调用各种static
方法听起来过于混乱。
答案 1 :(得分:0)
我认为参数的价值可能被替换为""通过另一个线程...线程有自己的方法上下文...所谓的调用堆栈。例如,您可以有50个线程在不同的值的同一时间调用String.valueOf(),并且每个线程都将获得其自己的线程上下文中的值。