次のJavaメソッドがスレッドセーフかどうかを判断しようとしています。
public Object calledByMultipleThreads() {
final Object[] item = new Object[1];
if (!EventQueue.isDispatchThread()) {
try {
EventQueue.invokeAndWait(new Runnable() {
@Override
public void run() {
helperMethod(item)
}
});
} catch (InterruptedException | InvocationTargetException ex) {
// logging...
}
} else {
helperMethod(item)
}
return item[0];
}
private void helperMethod(Object[] item) {
item[0] = new Object();
}
私はそれfinal Object[] item = new Object[1]が回避策であることを知っています(のようなものfinal Object itemは内部で変更できなかったのでRunnable)。invokeAndWaitが使用されているため、は、item[0]によって参照される前に設定されますreturnが、呼び出し元のスレッド(EDTではない)がitem配列の更新を認識せず、を返す可能性があるのではないかと心配していnullます。これは可能ですか?安全性をテストする方法はありますか?