Спин-блокировка по сравнению с семафором

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

112
задан mrkotfw 18 August 2017 в 08:14
поделиться

4 ответа

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

Вы использовали бы семафор при большем количестве обстоятельств, но использовали бы спин-блокировку, куда Вы собираетесь заблокировать в течение очень короткого времени - существует стоимость для блокировки особенно при блокировке много. В таких случаях это может быть более эффективно к спин-блокировке, на некоторое время ожидая защищенного ресурса для становления разблокированным. Очевидно, существует хит производительности, если Вы вращаетесь слишком долго.

обычно, если Вы вращаетесь для дольше, чем квант потока, тогда необходимо использовать семафор.

73
ответ дан gbjbaanb 24 November 2019 в 02:48
поделиться

Свыше того, что заявили Yoav Aviram и gbjbaanb, другой ключевой пункт раньше был, что Вы никогда не будете использовать спин-блокировку на машине единственного ЦП, тогда как семафор имел бы смысл на такой машине. В наше время Вам часто трудно находить машину без нескольких ядер или гиперпоточность, или эквивалентный, но в сложившейся ситуации что у Вас есть просто единственный ЦП, необходимо использовать семафоры. (Я полагаю, что причина очевидна. Если единственный ЦП будет активным ожиданием чего-то еще для выпуска спин-блокировки, но это работает на единственном ЦП, блокировка вряд ли будет выпущена до текущего процесса или потока вытесняется O/S, который мог бы требовать времени, и ничего полезного не происходит, пока вытеснение не происходит.)

25
ответ дан Jonathan Leffler 24 November 2019 в 02:48
поделиться

Спин-блокировка относится к реализации блокировки межпотока с помощью инструкций по зависимой сборке машины (таких как тест-и-набор). Это называют спин-блокировкой, потому что поток просто ожидает в цикле ("вращения"), неоднократно проверяющие, пока блокировка не становится доступной (активное ожидание). Спин-блокировки используются вместо взаимных исключений, которые являются средством, предоставленным операционными системами (не ЦП), потому что спин-блокировки работают лучше, если заблокировано в течение короткого периода времени.

А Semaphor является средством, предоставленным операционными системами для IPC, для этого это - основная цель, inter-process-communication. Быть средством, предоставленным операционной системой, это - производительность, не будет так же хорошо как та из спин-блокировки для inter-thead, блокирующего (хотя возможный). Семафоры лучше для блокировки в течение более длительных промежутков времени.

, Который сказал - реализующий splinlocks в блоке, является хитрым, и не портативным.

7
ответ дан yoav.aviram 24 November 2019 в 02:48
поделиться

Я не эксперт по ядру, но вот несколько моментов:

Даже однопроцессорная машина может использовать спин-блокировки, если во время компиляции ядра включено вытеснение ядра. Если вытеснение ядра отключено, то спин-блокировка (возможно) заменяется оператором void .

Кроме того, когда мы пытаемся сравнить семафор и спин-блокировку, я считаю, что семафор относится к тому, который используется в ядре, а НЕ к тому, который используется для IPC (пользовательского пространства).

В основном, спин-блокировка должна использоваться, если критическая секция мала (меньше, чем накладные расходы на сон / пробуждение) и критическая секция не вызывает ничего, что может спать! Семафор должен использоваться, если критическая секция больше и может спать.

Раман Чалотра.

8
ответ дан 24 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: