Что значит сказать, что список внутренне заблокирован?
Этот код из книги Эффективная Java
Object[] snapshot = list.toArray();// Locks list internally
Я в основном заинтересован в комментарии здесь. Это делает список unmodifiable
? Что значит сказать, что список внутренне заблокирован? Как долго хранится этот замок? Есть ли лучшая альтернатива для преобразования списка в массив?
4 ответа
Я полагаю, что это означает, что список не поддерживает ссылку на возвращенный массив, что означает, что массив может быть изменен без влияния на исходный список, откуда он пришел. Аналогично, любые изменения в списке не будут отражены в массиве.
Это важно с точки зрения безопасности потока, потому что это означает, что вы можете перебирать содержимое списка с точки зрения безопасности потока, не беспокоясь о том, что другой поток тем временем изменяет состояние списка. В этом смысле состояние списка "заблокировано" в возвращаемом массиве, независимо от того, какие изменения были внесены в список впоследствии - вы можете видеть его как создание снимка.
toArray();
не изменяет состояние списка - поэтому он не делает его неизменяемым или что-то в этом роде.
Как и другие, я думаю, что это о параллелизме:
Текст из javadoc из java.uitl.List
Возвращенный массив будет "безопасным", так как в этом списке нет ссылок на него. (Другими словами, этот метод должен выделять новый массив, даже если этот список поддерживается массивом). Вызывающая сторона, таким образом, может модифицировать возвращаемый массив.
Для тех, кто интересуется, где происходит "внутренняя блокировка":
Обратите внимание, что Дж. Блох пишет в качестве введения для данного кода: "Например, предположим, что у вас есть синхронизированный список (типа, возвращаемого Collections.synchroniedList
) (...)"
В таком случае toArray()
действительно "блокирует внутреннее", потому что реализация синхронизированного списка будет делать это (с мьютексом), предотвращая любые изменения другими потоками, пока создается разъединенный массив.
Речь идет о безопасности потоков - т.е. преобразование списка в массив будет потокобезопасным
Редактировать:
Проще всего - вы можете принять это как
- когда
Thread one
преобразует Список -> Массив, никакой другой поток не может изменять список до того времениThread one
не завершил преобразование