假设我有一个方法,它被两个或多个线程访问,我想让它成为线程安全的。
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/