java - JavaFX 属性对象对于多个异步写入来说是线程安全的吗?

标签 java multithreading concurrency javafx javafx-8

JavaFX 中 Property 的标准实现从多个线程调用 set 方法是否危险?我并不真正关心客户端读取然后设置操作的竞争条件。我想知道如果多个线程调用其 set()setValue() 方法,Property 本身是否会在内部被损坏。

下面这段代码是线程安全的吗?

public class ThreadSafeProperty {

    public static void main(String[] args) {

        ObjectProperty<Integer> property = new SimpleObjectProperty<>(5);

        ExecutorService exec = Executors.newFixedThreadPool(5);

        property.addListener((obs,o,n) -> System.out.println("OLD: " + o + " NEW: " + n));


        exec.execute(() -> property.set(4));
        exec.execute(() -> property.set(6));
        exec.execute(() -> property.set(11));

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        exec.shutdown();
    }
}

最佳答案

SimpleObjectProperty 不是线程安全的。

您在源代码中看到这一点:javafx/beans/property/ObjectPropertyBase.set 未同步,或者您使用类似 http://vmlens.com 的工具女巫正在寻找你:-)

vmlens report

关于java - JavaFX 属性对象对于多个异步写入来说是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30811032/

相关文章:

java - 在java中显示日期和时间,比较当前日期和过去日期

python - 从子线程停止主线程

c# - ThreadLocal 性能与使用参数

java - 使用列表的线程和并发修改异常

java - Java 读者作者并发问题

java - 使用 google map api 时获取 "peer not authenticated"

java - NDK : keeping variables passed from java layer alive in c++ layer by copy by value

java - 从 Java 应用程序将数据导入 Cassandra 2 的最快方法是什么?

c - 为什么 typedef 不能与 pthread 一起使用?

Golang并发死锁