Если я вызываю объект синхронизированным, могу ли я получить доступ к объектам внутри этого объекта, как если бы они были синхронизированы? Или я могу получить доступ только к типам данных?Синхронизировано влияет на членов объекта?
ответ
Возможно, но только с осторожностью. Вы можете сделать это, если вы всегда блокируете один и тот же объект.
Скорее всего, вам необходимо заблокировать каждый объект.
Несмотря на то, что ваша цель - защитить данные, синхронизация обеспечивает исключительность вокруг блока кода, а не фрагмента данных. Код за пределами блоков синхронизации (или в блоках, которые используют разные объекты), может изменять данные, которые вы пытаетесь защитить, даже если это не то, что вы хотите.
Любая правильная стратегия блокировки должна гарантировать, что блоки кода, которые могут мешать друг другу, удерживают один и тот же замок. Это включает в себя код, который может помешать другой копии самого запуска во втором потоке.
synchronized (myObject) {
// sensitive code
}
Блокировка на уровне методы является просто сокращением для запирания this
указателя на тело метода. (Или объект class
для статического метода).
Способность к synchronize
на каждом объекте является обычно цитируемой досадой в Java, потому что это сбивает с толку.
В принципе, все это означает, что каждый объект может быть блокировкой. Вот и все. Следовательно, при блокировке родительского объекта особый эффект не действует на объект, и не имеет значения, какой конкретный объект вы используете в качестве блокировки. Если все ваши потоки блокируются на одном и том же объекте, только один из них будет запускать/получать доступ к любому коду в синхронизированном блоке. Если некоторые из них этого не делают, такой гарантии нет.
Если вы хотите, чтобы только один поток обращался к члену в любой момент времени, убедитесь, что все потоки, которые обращаются к этому члену, блокируют (или «синхронизируют») на одном и том же объекте, прежде чем обращаться к нему. Пока вы это делаете, не имеет значения, какой объект вы используете для блокировки.
- 1. Синхронизировано между экземплярами объекта
- 2. Как модификатор const для функций-членов влияет на разрешение перегрузки?
- 3. C#: Фильтр членов объекта
- 4. Обнаружение членов объекта Ruby?
- 5. «Синхронизировано» на внутреннем объекте, например. gameloop.player1
- 6. Rxjava: Нанести лечение на членов объекта
- 7. Почему синхронизировано (это) работает?
- 8. копия объекта не влияет на мой код
- 9. Почему FaceAlpha влияет на ZData другого объекта?
- 10. pixi.js pivot влияет на позицию объекта
- 11. Обнаружение недопустимого использования членов объекта
- 12. Вызов членов объекта в функции
- 13. GDB не отображает членов объекта
- 14. C# Получить членов общего объекта
- 15. Изменение свойств объекта влияет на изменение свойства объекта B
- 16. C# итерация через членов объекта
- 17. Изменение членов объекта внутри ArrayList
- 18. omxplayer: аудио не синхронизировано
- 19. Сохранение ресурсов i18n синхронизировано
- 20. Хранение подвижных данных Синхронизировано
- 21. Синхронизировано в AsyncTask
- 22. членов доступа C++ объекта в JavaScript без регистрации его членов
- 23. Почему имяList.add не синхронизировано?
- 24. понимание синхронизировано в java
- 25. Значения сканера не синхронизировано
- 26. Заблокировано в ожидании @синхронизировано
- 27. Синхронизировано унаследовано в Java?
- 28. Синхронизировано в потоке Java
- 29. Как размер объекта влияет на производительность массива на C++?
- 30. Какова структура структуры Java для членов объекта?
Ваш вопрос очень расплывчатый - что вы подразумеваете под термином «вызов объекта синхронизации»? Это действительно поможет, если вы укажете конкретный пример кода. –