2013-05-04 2 views
1

Если я вызываю объект синхронизированным, могу ли я получить доступ к объектам внутри этого объекта, как если бы они были синхронизированы? Или я могу получить доступ только к типам данных?Синхронизировано влияет на членов объекта?

+3

Ваш вопрос очень расплывчатый - что вы подразумеваете под термином «вызов объекта синхронизации»? Это действительно поможет, если вы укажете конкретный пример кода. –

ответ

0

Возможно, но только с осторожностью. Вы можете сделать это, если вы всегда блокируете один и тот же объект.

Скорее всего, вам необходимо заблокировать каждый объект.

1

Несмотря на то, что ваша цель - защитить данные, синхронизация обеспечивает исключительность вокруг блока кода, а не фрагмента данных. Код за пределами блоков синхронизации (или в блоках, которые используют разные объекты), может изменять данные, которые вы пытаетесь защитить, даже если это не то, что вы хотите.

Любая правильная стратегия блокировки должна гарантировать, что блоки кода, которые могут мешать друг другу, удерживают один и тот же замок. Это включает в себя код, который может помешать другой копии самого запуска во втором потоке.

synchronized (myObject) { 
    // sensitive code 
} 

Блокировка на уровне методы является просто сокращением для запирания this указателя на тело метода. (Или объект class для статического метода).

0

Способность к synchronize на каждом объекте является обычно цитируемой досадой в Java, потому что это сбивает с толку.

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

Если вы хотите, чтобы только один поток обращался к члену в любой момент времени, убедитесь, что все потоки, которые обращаются к этому члену, блокируют (или «синхронизируют») на одном и том же объекте, прежде чем обращаться к нему. Пока вы это делаете, не имеет значения, какой объект вы используете для блокировки.

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