3

条件式がJavaのスレッドセーフな操作であるかどうか疑問に思います。
例えば:

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

したがって、私の質問は、2つのスレッドがmObjectを変更できる場合、このコードスレッドは安全ですか、それとも開発者は競合状態を処理する必要がありますか?

4

3 に答える 3

7

いいえ、それは絶対にスレッドセーフではありません。あなたは間違いなくNullPointerExceptionここを得ることができます。もちろん、修正は簡単です。

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

または、この特定のケースではさらに簡単に:

return String.valueOf(mObject);

編集:コメントに記載されているように、同期なしで値を更新するために2つのスレッドが競合している場合、それはおそらくより大きな問題の兆候です...しかし、私はあなたが具体的に尋ねた質問に答えようとしただけです。

于 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 に答える