在 JavaFX 中,observableArrayList 线程安全吗?

In JavaFX, is an observableArrayList thread safe?

我通过修改可观察数组列表来更新 table,但现在 2 个线程可能会修改可观察数组列表。我应该将修改列表的代码放在同步方法中,还是只允许 1 个线程修改列表?

不,ObservableList 的实现只是一个包装器,它在普通 List(普通 java 集合)

上添加了 listner 方法

所以不是线程安全的,你可以去看看ObservableListWrapper的源码。

更多信息:https://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm

您可以通过调用

从 ObservableList 创建一个同步的 ObservableList
javafx.collectionsFXCollections.synchronizedObservableList(observableList)

这会为您的 observableList 创建一个包装器,您可以使用它来将项目添加到您的列表中。

问题是同步对您意味着什么。因为技术同步并不一定意味着它在您的业务需求方面是同步的,例如如果您必须通过在列表中连续调用 add(...) 两次来添加 2 个项目,并确保它们按顺序包含(中间没有其他项目)。也许无论如何你都必须确保不同级别的同步。

对于此特定用例 - ObservableList 绑定到 TableView,您只能从 FX 应用程序线程访问列表。这是因为对列表的更改将导致 TableViewall changes to the scene graph must occur on the FX Application Thread.

的更改

所以在这种情况下,关于 ObservableList 是否线程安全的问题是一个有争议的问题:由于其他原因你只能从单个线程访问它,你不需要它来是。

如果您有一个需要更新列表的后台线程,您可以安排这些更新在 FX 应用程序线程上发生,方法是将它们包装在对 Platform.runLater(...), or (and this is probably preferable) by using the javafx.concurrent API 的调用中以管理您的线程。