2016-02-14 3 views
1

Предположим, что у меня 4 объекта, A, B, C и D.Java синхронизации дилемма

  • Все методы на A синхронизированы.
  • Никакие методы на B, C и D не синхронизированы.
  • Б доступ только A
  • С доступом оба A и B
  • D является accesed только B

Метода на А может быть вызвана из разных потоков одновременно. Является ли данный сценарий потокобезопасным? То есть все считывают и записывают в B, C и D, видимые для всех потоков?

Заранее благодарен!

ответ

3

Таким образом, все обращения запускаются из синхронизированных методов A, и все чтения и записи A, B, C и D выполняются при блокировке на A. Тогда да, это сделает эту компоновку безопасной по потоку (насколько память доступ, не может говорить о бизнес-логике).

Примечание. Вы сказали «объекты», а не «классы», поэтому я предполагаю, что это то, что вы имели в виду. Если у вас, например, несколько экземпляров B, и они распределены между несколькими экземплярами A, это может быть уже не потокобезопасным. Дерево объектов, к которому обращаются ваши потоки, должно соответствовать заблокированным им замкам.

+0

Спасибо большое! По сути, у меня есть пользовательский интерфейс, который работает в своем потоке и вызывает контроллер, который синхронизирован. Контроллер представляет собой игровой цикл игрового движка, поэтому он создает отдельный поток, который вызывает синхронный метод handleTick контроллера через некоторое время. Проблема заключалась в том, что игры с сохранением/загрузкой осуществляли доступ к игровым данным через контроллер из потока пользовательского интерфейса, а не к потоку игрового цикла. Поскольку только один поток работает сразу с игровыми данными, я не был уверен, что все в порядке. Еще раз, большое спасибо! –

+1

Да, если все состояние игры «принадлежит» и доступно исключительно через контроллер, вам нужно только синхронизировать контроллер. – Thilo

Смежные вопросы