静态方法参数的同步

时间:2014-03-25 20:30:51

标签: java multithreading static synchronization block

我有一个关于java与静态方法同步的问题。

更确切地说,我有一个带有静态方法的类,可以由多个线程同时使用。我的类的主要静态方法有一个参数,并且一个接一个地调用其他辅助静态方法。

我的问题如下:由于该类一次可以由多个线程使用,是否存在另一个线程用另一个线程替换该参数的风险?

我曾想过在我的主函数的参数变量上使用同步块,包含方法的整个代码(以及对辅助函数的调用),但我不确定它是一个好的解决方案

有人可以帮助我吗?

2 个答案:

答案 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(),并且每个线程都将获得其自己的线程上下文中的值。