java - 在匿名类中使用数组线程安全吗?

标签 java thread-safety

我正在尝试确定以下 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/

相关文章:

java - HashMap 对于不同的键来说是线程安全的吗?

multithreading - 类似于线程安全映射的对仅在一个线程上存在的值的访问

java - 我应该将 java.util.concurrent.ConcurrentLinkedQueue 引用声明为 volatile 吗?

java - 如何将对象从主线程传递到java中的另一个线程

java - 单击 JavaFX 按钮上的“删除卡”

java - jstack 格式更改

c++ - 在线程 A 中创建 std::thread 对象,加入线程 B

Java:Apache POI:我可以从 MS Word (.doc) 文件中获取干净的文本吗?

java - 使用 extjs 4 spring 上传图像文件

java - 从 Servlet 启动独立应用程序的线程