假設我有一個方法,它可以被兩個或多個線程訪問,並且我想讓它成爲線程安全的。同步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