3

我想知道条件表达式是否是Java中的线程安全操作。
例如:

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

所以,我的问题是:如果两个线程可以改变 mObject,这个代码线程安全吗,还是开发人员需要处理任何竞争条件?

4

3 回答 3

7

不,这绝对不是线程安全的。你绝对可以在NullPointerException这里得到一个。当然,这很容易修复:

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

或者,在这种特殊情况下更容易:

return String.valueOf(mObject);

编辑:如评论中所述,如果你真的有两个线程竞相更新一个没有同步的值,那可能是更大问题的迹象......但我只是试图回答你特别提出的问题。

于 2012-08-13T13:31:44.747 回答
2

不,它不是线程安全的,只需制作以下内容的本地副本mObject

final Object local = mObject;
return (local != null ? local.toString() : "null"); 
于 2012-08-13T13:32:03.113 回答
2

开发人员需要确保他们对任何可以更改的字段都有一致的看法。

这可能是一个解决方案

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

或者

return String.valueOf(mObject);

或者

return ""+mObject;
于 2012-08-13T13:32:28.373 回答