假设我有一个方法,可以由两个或多个线程访问,我想使它变得线程安全。
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)?