Я изучаю, как структура стропов работает за пределами. Но мои знания о многопоточном программировании очень ограничены, чтобы понять, что они делают. Вот моя проблема:Понимание синхронизируемого ключевого слова на AdapterManagerImpl класс рамки стропа
Это класс, над которым я работаю AdapterManagerImpl.java, на функции registerAdapterFactory (строка 247) они определили синхронизированный кодовый блок в линия 281 это:
synchronized (adfMap) {
adfMap.put(reference, factoryDesc);
}
Любой один может объяснить мне, почему adfMap
является общим ресурсом и помечено как синхронизируется? Как это влияет на производительность?
Я не знаю этого фреймворка, но кажется, что afMap может быть доступен или «использован» разными потоками одновременно. Поэтому вам необходимо защитить его от одновременной модификации, синхронизируя его. Хотя в синхронизированном блоке ни один другой поток не может получить блокировку, поэтому им придется подождать. Это влияет на производительность курса, но это сильно зависит от вероятности столкновений. Сам акт синхронизации также вводит дополнительные накладные расходы в отношении производительности - независимо от того, сколько коллизий происходит. – Fildor
Фрагмент кода не _mark_ adfMap. Это синхронизированное _statement_. Он выполняется в три этапа: во-первых, adfMap заблокирован, затем выполняется оператор (или операторы) внутри фигурных скобок, а затем adfMap разблокируется. Основное значение блокировки объекта заключается в том, что ни один из двух потоков никогда не позволяет блокировать один и тот же объект одновременно. –
Синхронизированный оператор вызывает первые потоки, которые называет этот код для доступа к объекту блокировки (тот, который находится в круглых скобках, _adfMap_ здесь). Теперь ни одна другая нить не может получить эту блокировку (для идентификации объекта блокировки) до тех пор, пока первый поток больше не будет ее удерживать. JVM предотвращает любой поток, который не удерживает блокировку, чтобы вызвать код, защищенный блокировкой. Следовательно, ни один другой поток не может вызывать код, защищенный этим блокиром, до тех пор, пока блокировка не будет освобождена. Однако другой поток может вызывать тот же код (например, в другом экземпляре класса), если блокировка относится к другому объекту. – Sebastian