在Java中,条件表达式是一个线程安全的操作吗?

时间:2012-08-13 13:28:58

标签: java multithreading thread-safety race-condition conditional-expressions

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

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

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

3 个答案:

答案 0 :(得分:7)

不,这绝对不是线程安全的。你绝对可以在这里获得NullPointerException。当然,这很容易解决:

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

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

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

答案 1 :(得分:2)

不,它不是线程安全的,只需制作mObject的本地副本:

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

答案 2 :(得分:2)

开发人员需要确保他们拥有可以更改的任何字段的一致视图。

这可能是一个解决方案

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

return String.valueOf(mObject);

return ""+mObject;