我試圖確定以下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
。這可能嗎?有什麼方法可以測試其安全性嗎?
如果有疑問,並且您需要將該數組作爲容器傳回對象,則始終可以使用AtomicReference。我已經養成了將它用作通用容器的習慣,以便從匿名回調(和類似的ocasion)中傳回結果,即使我不需要原子方面。 – Durandal 2013-02-20 18:41:10