假设我有一个方法,它可以被两个或多个线程访问,并且我想让它成为线程安全的。同步java中的形式参数
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)?
您的同步块已足够。每当同步对象的监视器被另一个线程占用时,JVM就会阻止该调用。 – 2011-03-09 19:25:38
@Brent,有没有其他方法可以做到这一点?就是想! – 2011-03-09 19:33:12
您的synchronized()是危险的。在下面检查我的答案。 – iluxa 2011-03-09 20:11:42