我正在尝试确定以下 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
这样的内容无法在 >可运行
)。由于使用了 invokeAndWait
,因此 item[0]
在被 return
引用之前被设置,但我担心调用者线程(即(不是 EDT)可能看不到 item
数组的更新,并返回 null
。这可能吗?有什么方法可以测试它的安全性吗?
最佳答案
由于 invokeAndWait
实现方式的细节,Runnable
内发生的所有操作发生在将控制权返回给调用者之前invokeAndWait
:
1233 synchronized (lock) {
1234 Toolkit.getEventQueue().postEvent(event);
1235 while (!event.isDispatched()) {
1236 lock.wait();
1237 }
1238 }
换句话说,你所做的事情是安全的。另一方面,无法通过测试来确保这样的保证:)
关于java - 在匿名类中使用数组线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14987066/