Я читаю "Концепции операционной системы с Java". Меня совершенно смущает концепция блокировки и синхронности, каковы различия между ними?
Каковы различия между блокировкой с синхронным, неблокирующим и асинхронным?
Ответ 1
Блокировка может или не может быть такой же, как синхронно, в зависимости от контекста. Когда мы говорим о вызовах методов, тогда синхронный вызов также можно назвать блокирующим (я немного вернусь к нему), потому что поток, вызывающий этот метод, не может двигаться вперед, пока метод не вернется. Антоним в этом случае будет асинхронным.
В терминологии блокировки блокировка считается блокирующей, если поток, ожидающий ее получения, помещается в приостановленный режим до тех пор, пока блокировка не станет доступной (или до истечения таймаута). Антоним в этом случае является блокировкой блокировки, что означает, что поток немедленно возвращается, даже если он не может получить блокировку. Это можно использовать для реализации так называемого прядильного замка, в котором вы продолжаете проверять состояние блокировки, сохраняя поток активным.
Сказав это, вы можете экстраполировать разницу между понятиями: синхронный обычно означает активность, которая должна ждать ответа, прежде чем поток сможет двигаться вперед. Блокировка относится к тому факту, что поток помещается в состояние ожидания (обычно это означает, что он не будет запланирован для выполнения до тех пор, пока не произойдет какое-либо событие). Отсюда можно сделать вывод, что синхронный вызов может включать в себя поведение блокировки или не может, в зависимости от базовой реализации (т.е. Может также вращаться, что означает, что вы имитируете синхронное поведение с асинхронными вызовами).
Ответ 2
синхронно означает, что работа выполняется в потоке, который вызывает функцию, и метод не возвращается до его завершения.
асинхронные методы возвращаются немедленно, потому что другой поток выполняет работу и создает флаг или запускает событие, когда работа выполнена.
Блокировкаозначает, что поток, выполняющий событие блокировки, будет ждать, пока событие не произойдет. например, вы пытаетесь прочитать из сокета, и никто не отправляет вам сообщение. блокирующий вызов не вернется, пока сообщение не будет восстановлено из сокета.
ну и неблокирование означает противоположность блокировке, подразумевая, что неблокирующие вызовы асинхронны.
Ответ 3
Я бы классифицировал их следующим образом:
Блокирование - поток будет ждать действия до тех пор, пока не будет успешным или неудачным (подсветка на "будет ждать", отказ обычно является таймаутом)
Synchronous - Thread завершит действие, либо с успехом, либо с ошибкой, до того, как достигнет любой строки после него (выделить на завершение действия)
Non-blocking - Thread не будет ждать завершения действия, немедленно выполняет действие
Асинхронный - другой поток (логический или физический) завершит действие или сообщит, что он готов с использованием обратного вызова, не дожидаясь, прежде чем выполнять следующие команды. Примечание: отсюда возникает имя асинхронное, так как вы не можете быть уверены, в каком порядке команды будут выполняться