Основное отличие состоит в том, что DispatchGroup
ближе к счетному семафору с обратным вызовом, тогда как NSLock
- это простой мьютекс .
Например, DispatchGroup
может быть enter
отредактировано более одного раза, одним или несколькими потоками, и enter
с DispatchGroup
никогда не заблокирует вызывающий поток.Вызывающие потоки также отвечают за балансировку каждого enter
вызова с помощью вызова leave
.Если в группе зарегистрирован обратный вызов notify
, он будет выполнен, как только число enter
с минус число leave
с достигнет 0. Хорошим примером использования DispatchGroup
будет создание нескольких сетейзапросы и имеют один фрагмент кода обратного вызова, выполняемый после того, как все сетевые запросы завершены (или истекло время ожидания и т. д.).
Однако, если один поток lock
s NSLock
, любой другой поток (или даже тот же самый поток, в этом отношении) пытается lock
это снова, прежде чем это будет unlock
ed, второй поток будет заблокирован, пока это не будет unlock
ed (и возможно никогда, если вы попытаетесь lock
это дважды из одной и той же ветки).Хорошим примером использования NSLock
является предоставление многопоточного доступа к одному изменяемому фрагменту данных.В этом случае несколько потоков могут быть уверены, что могут получать согласованные операции чтения и записи в / из изменяемого хранилища без потенциального вытеснения друг друга.
NSLock
(и мьютексы в целом) являются примитивом синхронизации гораздо более низкого уровня, чемDispatchGroup
.В общем, вы всегда должны использовать примитив самого высокого уровня, который достигает вашей цели.Если DispatchGroup
выполнит эту работу, используйте ее и игнорируйте NSLock
.