次の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
ます。これは可能ですか?安全性をテストする方法はありますか?