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; 
相关问题