O 'bloco' lock, em linguagem C# é semelhante ao método synchronized, da linguagem Java, o qual funciona como um 'semáforo' garantindo acesso exclusivo a um certo recurso.
Mas por que não é alternativa B ? O bloco lock também não evita deadlock? Na verdade a questão esta correta pois foi extraída daqui: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/lock-statement
Mas conforme menciona Tannenbaum, para haver um deadlock (impasse) é necessário haver 4 condições( Exclusão mútua, posse e espera, não preempção e espera circular). Condição de corrida é evitado com a exclusão mútua - acesso exclusivo - corroborando para o gabarito da questão, pois para haver deadlock é necessário existir uma condição de corrida e MAIS 3 CONDIÇÕES. Ou seja, o bloco lock evita uma race condition e não as outras 3 condições, por isso não podemos afirmar que o bloco lock evita deadlock
GABARITO ALTERNATIVA A