2

我想知道如果一個條件表達式是Java中的線程安全操作。
例如: -在Java中,是一個線程安全操作的條件表達式嗎?

return (mObject != null ? mObject.toString() : "null"); 

所以,我的問題是:如果兩個線程可以改變mObject,是該代碼線程安全的,還是開發者需要處理的任何競爭條件?

+0

聽起來就像如果mObject是可變的,共享的,你應該同步整個方法。 – duffymo 2012-08-13 13:31:40

+0

簡短的回答,與您提供的條件三元運算符有關,不是。回想一下,即使像int i = 0這樣的假象不是「線程安全的」(因此Atomic *類) – 2012-08-13 13:40:56

回答

6

不,這絕對不是線程安全的。你一定可以在這裏獲得NullPointerException。這是很容易解決的,當然:在這種特殊情況下

Object tmp = mObject; 
return tmp != null ? tmp.toString() : "null"; 

,或者甚至更容易:

return String.valueOf(mObject); 

編輯:正如在評論中指出,如果你真的有兩個線程競相更新一個值沒有同步,這是可能一個更大的問題的跡象......但我只試圖回答你具體問的問題。

+0

是不是有點太簡單?這個解決方案可以防止NPE,但是在tmp是空的情況下,mObject仍然不可能在複製後被改變,因此返回的值不是mObject – gefei 2012-08-13 13:35:00

+1

@ G.Z的實際值。 OP沒有對內存可見性做任何說明,所以我認爲答案很明顯地回答了這個問題。 – maba 2012-08-13 13:38:16

+0

@ G.Z .:編輯了我的答案以指示潛在的其他問題。 – 2012-08-13 13:44:20

2

不,這不是線程安全的,只是做的mObject本地副本:

final Object local = mObject; 
return (local != null ? local.toString() : "null"); 
2

開發人員需要確保他們有哪些是可以改變的任何領域的一致視圖。

這可能是一個解決方案

Object mObject = this.mObject; 
return mObject != null ? mObject.toString() : "null"; 

return String.valueOf(mObject); 

return ""+mObject; 
相關問題