Возможно, проблема в том, что поток обращается к списку. Скорее всего, он не должен быть захвачен каким-либо разрешением для прослушивателя, поэтому не существует надлежащего способа присоединить слушателя к списку.
Однако, если у вас есть контроль над классом SharedEntiry, вы можете «взломать» доступ к списку, используя синхронизированный. Однако вы прямо заявили, что список может быть воссоздан, поэтому я предполагаю, что экземпляр, сохраненный за values
, действительно может быть заменен.
В основном у вас есть три случая:
1 Список values
заменен новым списком:
Решите это, сделав вторую ссылку в Списке:
private List<Map<String,Object>> valuesPrevious;
Всякий раз, когда вы проверяете наличие изменений, сначала проверяйте идентичность списков. Если они не соответствуют друг другу, вы можете быть уверены, что список изменился (по крайней мере, экземпляр, если не содержимое).
if (values != valuesPrevious) {
// handle change.
}
Да, вам все еще нужно периодически проверять, но сравнение идентификаторов является относительно дешевым и, следовательно, доступным потоком для запуска в фоновом режиме.
2 Список values
заменяется новым списком (типа, который вы не задавали):
Если это произойдет, переместите все значения из списка API в экземпляр вашего наблюдаемого списка (описанного ниже), установите значения для этого экземпляра и дождитесь следующего изменения.
3 Значения изменились, но экземпляр тот же:
Решите это с помощью ObservableList (если вы реализуете в Java10 + https://docs.oracle.com/javase/10/docs/api/javafx/collections/ObservableList.html) или сами реализуете такой List (возможно, расширяя существующий тип List).
Затем этот слушатель устанавливает только «грязный» флаг, и ваш метод знает, что произошло изменение (и сбрасывает флаг).
В любом случае, я бы хотел убедиться, что поток, обрабатывающий изменение, запускает только другой поток для обработки изменения, а не блокирует доступный поток, поскольку я подозреваю, что ваш @ BindMagic-API имеет своего рода фактор, связанный со временем выполнения (например, это тень сети или базы данных).
Если вы просто заблокируете поток, пока не обработаете свою реакцию, вы можете получить странные эффекты, отключиться или в итоге случайно заблокировать сервер, к которому вы обращаетесь.