java - 静态方法参数的同步

标签 java multithreading static synchronization block

我有一个关于静态方法的 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/

相关文章:

c++ - 如何从外部将值传递给结构函数?

c# - 读取派生类的属性值

java - 是否存在具有不同数量的输入/输出,但核心工作职责相同的模式?

java - 选择时图像未加载

java - CsvToBeanBuilder 无法将 CSV 数据转换为对象

java - 未连接充电器时 Android 速度变慢?

java - 一组子集中的数字总和

ios - 如何确保 MIDI 消息以正确的顺序到达?

python - 在 python 中处理不断变化的列表的正确方法

c++ - "undefined reference"到静态字段模板特化