2015-10-29 6 views
0

Я изучаю, как структура стропов работает за пределами. Но мои знания о многопоточном программировании очень ограничены, чтобы понять, что они делают. Вот моя проблема:Понимание синхронизируемого ключевого слова на AdapterManagerImpl класс рамки стропа

Это класс, над которым я работаю AdapterManagerImpl.java, на функции registerAdapterFactory (строка 247) они определили синхронизированный кодовый блок в линия 281 это:

 synchronized (adfMap) { 
      adfMap.put(reference, factoryDesc); 
     } 

Любой один может объяснить мне, почему adfMap является общим ресурсом и помечено как синхронизируется? Как это влияет на производительность?

+1

Я не знаю этого фреймворка, но кажется, что afMap может быть доступен или «использован» разными потоками одновременно. Поэтому вам необходимо защитить его от одновременной модификации, синхронизируя его. Хотя в синхронизированном блоке ни один другой поток не может получить блокировку, поэтому им придется подождать. Это влияет на производительность курса, но это сильно зависит от вероятности столкновений. Сам акт синхронизации также вводит дополнительные накладные расходы в отношении производительности - независимо от того, сколько коллизий происходит. – Fildor

+0

Фрагмент кода не _mark_ adfMap. Это синхронизированное _statement_. Он выполняется в три этапа: во-первых, adfMap заблокирован, затем выполняется оператор (или операторы) внутри фигурных скобок, а затем adfMap разблокируется. Основное значение блокировки объекта заключается в том, что ни один из двух потоков никогда не позволяет блокировать один и тот же объект одновременно. –

+0

Синхронизированный оператор вызывает первые потоки, которые называет этот код для доступа к объекту блокировки (тот, который находится в круглых скобках, _adfMap_ здесь). Теперь ни одна другая нить не может получить эту блокировку (для идентификации объекта блокировки) до тех пор, пока первый поток больше не будет ее удерживать. JVM предотвращает любой поток, который не удерживает блокировку, чтобы вызвать код, защищенный блокировкой. Следовательно, ни один другой поток не может вызывать код, защищенный этим блокиром, до тех пор, пока блокировка не будет освобождена. Однако другой поток может вызывать тот же код (например, в другом экземпляре класса), если блокировка относится к другому объекту. – Sebastian

ответ

0

adfMap

используется как блокировка.

synchronized (adfMap) { ... } 

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

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

Когда этот замок является частным статическим членом в AdapterManagerImpl, это означает, что ни один из двух потоков не может одновременно вводить любой код, защищенный этой блокировкой, в любом экземпляре AdapterManagerImpl.

Более формальное объяснение: Защитные ограждения блокируют все защищенные им секторы кода одновременно двумя разными потоками (один и тот же поток может вводить код более одного раза -> повторная синхронизация). Блокировка, которая является объектом, защищает все разделы кода, защищаемые этим объектом блокировки (идентификатор объекта). Если есть еще одна переменная блокировки с идентичным именем где-то в коде, это полностью не зависит от первой блокировки.

+0

У вас недостаточно информации для подтверждения этой претензии. Два или более потока _can_ выполняют код в фигурных скобках одновременно, если выражение 'adfMap' дает разные ссылки на объекты для разных потоков. Например, если синхронизированный блок появился в методе экземпляра, а 'adfMap' - переменная экземпляра. –

+0

@james large: Я обратился к этой проблеме (по статическому члену), но смущающе. В следующий раз внимательно прочитайте ответы. Улучшенное объяснение.Однако не забывайте, что ОП утверждал, что у него мало знаний в потоковом режиме, поэтому вам следует избегать объяснений, которые настолько сложны, что они ему не помогают. – Sebastian

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