同步java中的形式参数

Rea*_*ed. 5 java multithreading

假设我有一个方法,可以通过两个或多个线程访问,我想让它保证线程安全.

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

   z = getInt(myObj);

   return x + y + z;  
}
Run Code Online (Sandbox Code Playgroud)

在这里,我认为我们不必同步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);
}
Run Code Online (Sandbox Code Playgroud)

这是正确的解决方案吗?并且,我们可以通过其他方式确保线程安全

z = getInt(myObj); (but only in case of different instances)?
Run Code Online (Sandbox Code Playgroud)

Bre*_*den 0

要回答“并且,我们可以通过什么方式确保线程安全......但仅在不同实例的情况下”,同步整个方法或创建另一个公共对象来充当所有线程的锁并对其进行同步而不是 myObj。