Jeśli Twój kod jest w procesie, w którym uruchamia się wiele wątków jednocześnie, może uruchamiać kod jednocześnie. Jeśli wynik każdego wykonania jest taki sam jak pojedynczy wątek, a wartości innych zmiennych są takie same jak oczekiwano, jest to bezpieczne dla wątku. Innymi słowy, interfejs dostarczany przez klasę lub program jest atomowy dla wątków i przełączanie się między wieloma wątkami nie prowadzi do niejednoznaczności w wyniku wykonania interfejsu, co oznacza, że nie musimy brać pod uwagę synchronizacji. Problemy z bezpieczeństwem wątków są spowodowane zarówno przez zmienne globalne, jak i statyczne. Jeśli każdy wątek ma tylko operacje odczytu dla zmiennych globalnych i zmiennych statycznych, ale nie wykonuje operacji zapisu, to ogólnie rzecz biorąc, ta zmienna globalna jest bezpieczna dla wątków; Jeśli wiele wątków wykonuje operacje odczytu i zapisu na zmiennej jednocześnie, zazwyczaj wymagana jest synchronizacja wątków, w przeciwnym razie może to wpłynąć na bezpieczeństwo wątków.
Celem blokady jest zapobieganie operacjom współbieżnym podczas wykonywania wielowątkowego, a obiekty typu referencyjnego blokowania pozwalają na działanie tylko jednego wątku w jego zablokowanym obszarze naraz.
Lock może zablokować tylko jedną zmienną typu odniesienia, czyli zablokować adres
Istnieje różnica między wynikami biegu z blokowaniem a bez niego:
Po zablokowaniu: wartość i będzie maleć jeden po drugim, nie będzie skoków, nie będzie powtarzających się wyników, aż do wartości 0;
Brak blokady: wartość wyjściowa i będzie skakać, nieciągła malejąca, i może mieć również wartość -1;
Powód: Po dodaniu blokady tylko jeden wątek może jednocześnie wykonać kod w zamkniętym obszarze, a oba wątki są wykonywane w kolejności, więc nie będzie przerwanego wyjścia. |