Как я уже сказал в своем комментарии, неправильно синхронизированный код не гарантирует ошибок per se .Однако это не означает, что указанный код, когда он используется в многопоточном контексте, действительно работает - вам просто повезло.В конце концов вы столкнетесь с неопределенным поведением , таким как поврежденное состояние, устаревшие значения и неожиданные исключения.Это связано с тем, что без синхронизации действия, выполняемые одним потоком, не гарантируются видимыми для любого другого потока.Вам необходимо отношение случай-до , более подробно описанное в документации из java.util.concurrent
и этого SO вопроса .
JavaFX, напримербольшинство фреймворков / инструментариев пользовательского интерфейса является однопоточным.Это означает, что существует специальный поток - в данном случае Поток приложения JavaFX - который отвечает за все действия, связанные с пользовательским интерфейсом 1 .Именно этот поток и только этот поток должен использоваться для доступа и / или изменения состояния, связанного с «живым» графом сцены (т. Е. Узлами, которые находятся в сцене, находящейся в окне, отображающем 2 ).Использование любого другого потока может привести к описанному выше неопределенному поведению .
Некоторые функции, связанные с пользовательским интерфейсом, фактически гарантируют, что они вызываются в потоке приложений JavaFX , обычно выбрасываяIllegalStateException
, если нет.Тем не менее, оставшиеся функции позволят вам молча вызывать их из любого потока, но это не значит, что это безопасно.Я полагаю, что это делается таким образом, потому что проверка потока в каждой функции, связанной с пользовательским интерфейсом, является кошмаром обслуживания и требует немалых затрат производительности.
1.Это немного сложнее, чем это;JavaFX также имеет «поток визуализации призмы» и «поток мультимедиа».См. Понимание архитектуры JavaFX для получения дополнительной информации.Но обратите внимание, что, с точки зрения разработчика приложения, единственный поток, который имеет значение, это Поток приложения JavaFX .
2.Это задокументировано Node
.Обратите внимание, что некоторые узлы, такие как WebView
, более ограничены, когда дело доходит до многопоточности;это будет задокументировано в соответствующих местах.