JavaFX中Property
的标准实现从多个线程调用set方法是否危险?我并不真正关心客户端的阅读和后续设置操作的竞争条件。我想知道如果多个线程调用其Property
或set()
方法,setValue()
本身是否可能在内部损坏。
此代码是否在线程安全下?
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();
}
}
答案 0 :(得分:1)
SimpleObjectProperty不是线程安全的。
你在源代码中看到了这一点:javafx / beans / property / ObjectPropertyBase.set未同步,或者你使用像http://vmlens.com这样的工具女巫找你: - )