1. Por que trancar e o que está trancado?
Quando usamos threads, a forma mais eficiente é, claro, assíncrona, ou seja, cada thread roda ao mesmo tempo, sem depender umas das outras e esperar. No entanto, quando diferentes threads precisam acessar um determinado recurso, é necessário um mecanismo de sincronização, ou seja, ao ler e escrever o mesmo recurso, é necessário que o recurso seja operado apenas por uma thread ao mesmo tempo para garantir que cada operação seja eficaz e imediata, ou seja, para garantir a atomicidade de sua operação. lock é o método de sincronização mais comumente usado em C#, no formato lock(objectA){codeB}.
lock(objectA){codeB} parece simples, mas na verdade tem três significados, o que é essencial para usá-lo adequadamente: 1. O objeto A está trancado? Se não, vou bloquear, caso contrário espero até o objeto A ser liberado. 2. Após o travamento, outras threads não podem chamar o codeB nem usar o objecto A durante a execução do codeB. 3. Após executar o codeB, o objeto de liberação A, e o codeB pode ser acessado por outras threads.
2. O que aconteceu com essa fechadura?
Vamos ver um exemplo:
No thread t1, o LockMe chama lock(this), ou seja, c1 na função principal, e ao chamar lock(c1) na thread principal, ele deve esperar que o bloco lock em t1 seja executado antes de acessar c1, ou seja, todas as operações relacionadas a c1 não podem ser completas, então vemos que até c1. DoNotLockMe() não é executado.
|