java - java中形式参数的同步

标签 java multithreading

假设我有一个方法,它被两个或多个线程访问,我想让它成为线程安全的。

public int getVal(int x, int y, MyClass myObj)  
{
   int z;

   z = getInt(myObj);

   return x + y + z;  
}

在此,我认为我们不必为 x + y 同步,因为它们是原语。

假设 getInt(myObj) 修改了 myObj 的状态并影响了 z 的值。

因此,我必须为 z = getInt(myObj); 行提供同步,但前提是两个线程都在“myObj”引用中传递相同的实例。作为 API 的编码器,我不知道两个线程是否会为“myObj”传递相同的实例。在某些情况下,这些线程可能会在“myObj”引用中传递相同的 MyClass 实例,而在其他情况下,它们可能会在“myObj”引用中传递不同的 MyClass 实例。

那么,如何确保行 z = getInt(myObj) 的线程安全? (当然,当传递的实例不同时,我们不想同步,而只需要在传递的实例相同时同步。我很清楚,这是无法确定的)。

假设不能使 MyClass 不可变,我认为以下可能是一个解决方案。

synchronized(myObj)
{
  z = getInt(myObj);
}

这是正确的解决方案吗?以及,我们还有哪些其他方式可以确保线程安全

z = getInt(myObj); (but only in case of different instances)?

最佳答案

你所拥有的是正确的。当您在对象上同步 时,它会锁定该实例而不是该类。因此,如果我将对象的相同 *实例* 传递给两个不同 方法,它将正确锁定该对象。但是,如果我传递两个不同的实例,则不会有任何锁定,因为两个实例 都有自己的

关于java - java中形式参数的同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5251024/

相关文章:

java - 文件在文件夹中时 Netbeans FileReader FileNotFound 异常?

python - (Python) 使用原始输入停止线程?

C++ 需要线程安全的经过良好测试的容器(非微软)

linux - linux下TCP/UDP高性能服务器

java - commons-exec : hanging when I call executor. 执行(命令行);

java - 一行的 JtextPane

java - Maven - 如何获取所有依赖的 Artifact

java - 在 Android 中隐藏另一个应用程序

Java - 基于第一列组织二维数组的问题

c# - 同步定时器以防止重叠