2013-02-20 3 views
4

Этот код из книги Эффективное JavaЧто значит сказать, что список заблокирован внутри?

Object[] snapshot = list.toArray();// Locks list internally 

Меня в основном интересует комментарий здесь. Составляет ли он список unmodifiable? Что значит сказать, что список заблокирован внутри страны? Как долго сохраняется этот замок? Есть ли лучшая альтернатива для преобразования списка в массив?

+2

его о потоковой безопасности – exexzian

+0

вы можете разместить больше контекста? – djechlin

ответ

3

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

Это важно с точки зрения безопасности потоков, поскольку это означает, что вы можете перебирать содержимое списка с точки зрения потока, не беспокоясь о том, что другой поток изменил значение sttae списка за это время. В этом смысле состояние списка «заблокировано» в возвращаемом массиве, вне зависимости от того, какие изменения внесены в список позже - вы можете увидеть его как получение моментального снимка.

toArray(); не изменяет состояние списка - поэтому он не делает его неизменяемым или что-то в этом роде.

1

Его о безопасности потока - то есть преобразования списка в массив будет поточно

Edit:
В простом способе - вы можете взять его в качестве

  • когда Thread one является преобразование Список -> Array другим не разрешено изменять список до момента времени Thread one не закончил преобразование
+1

Можете ли вы дать ссылку на это? Глядя на источник ArrayList.toArray(), я не вижу никаких блокировок, которые мешали бы другому потоку изменять состояние ArrayList, пока процесс toArray находится в процессе. – sharakan

+0

Ваша пуля не является технически правильной. Все, что происходит, это System.arraycopy. Таким образом, 1 поток может вводить метод 'toArray' и перед вызовом System.arraycopy другой поток может изменить список. «Замок» более корректно объясняется berry120, в котором он блокирует текущее состояние и назначает новый массив. –

+0

@sharakan @ -john yeah m погружается в исходный код, чтобы глубже изучить - хотя согласен @ -берри правильно – exexzian

2

Как и другие сказали, я думаю, что это о параллельности:

Текст от Javadoc из java.uitl.List

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

1

Для тех, кому интересно, где «внутренняя блокировка» имеет место:

Пожалуйста, обратите внимание, что Д. Блох пишет как введение для данного кода: «Например, предположим, что у вас есть синхронизированный список (из рода возвращенного Collections.synchroniedList) (...)»

В этом случае toArray() действительно„блокирует внутренний“, потому что реализация синхронизированного списка будет делать только что (с взаимной блокировкой) предотвращение каких-либо изменений со стороны других потоков в то время как dec создаётся массив.

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

  • Нет связанных вопросов^_^