我想知道如果一個條件表達式是Java中的線程安全操作。
例如: -在Java中,是一個線程安全操作的條件表達式嗎?
return (mObject != null ? mObject.toString() : "null");
所以,我的問題是:如果兩個線程可以改變mObject,是該代碼線程安全的,還是開發者需要處理的任何競爭條件?
我想知道如果一個條件表達式是Java中的線程安全操作。
例如: -在Java中,是一個線程安全操作的條件表達式嗎?
return (mObject != null ? mObject.toString() : "null");
所以,我的問題是:如果兩個線程可以改變mObject,是該代碼線程安全的,還是開發者需要處理的任何競爭條件?
不,這絕對不是線程安全的。你一定可以在這裏獲得NullPointerException
。這是很容易解決的,當然:在這種特殊情況下
Object tmp = mObject;
return tmp != null ? tmp.toString() : "null";
,或者甚至更容易:
return String.valueOf(mObject);
編輯:正如在評論中指出,如果你真的有兩個線程競相更新一個值沒有同步,這是可能一個更大的問題的跡象......但我只試圖回答你具體問的問題。
不,這不是線程安全的,只是做的mObject
本地副本:
final Object local = mObject;
return (local != null ? local.toString() : "null");
開發人員需要確保他們有哪些是可以改變的任何領域的一致視圖。
這可能是一個解決方案
Object mObject = this.mObject;
return mObject != null ? mObject.toString() : "null";
或
return String.valueOf(mObject);
或
return ""+mObject;
聽起來就像如果mObject是可變的,共享的,你應該同步整個方法。 – duffymo 2012-08-13 13:31:40
簡短的回答,與您提供的條件三元運算符有關,不是。回想一下,即使像int i = 0這樣的假象不是「線程安全的」(因此Atomic *類) – 2012-08-13 13:40:56