1. Varför låsa och vad är låst?
När vi använder trådar är det mest effektiva sättet förstås asynkront, det vill säga att varje tråd körs samtidigt, utan att förlita sig på varandra och vänta. Men när olika trådar behöver åtkomst till en viss resurs krävs en synkroniseringsmekanism, det vill säga när man läser och skriver samma resurs måste resursen endast drivas av en tråd samtidigt för att säkerställa att varje operation är effektiv och omedelbar, det vill säga att säkerställa atomiciteten i dess funktion. lock är den mest använda synkroniseringsmetoden i C#, i formatet lock(objectA){codeB}.
lock(objectA){codeB} verkar enkelt, men har faktiskt tre betydelser, vilket är avgörande för att använda det på rätt sätt: 1. Är objektA låst? Om inte, låser jag den, annars väntar jag tills objektA släpps. 2. Efter låsning kan andra trådar inte anropa codeB eller använda objektA under exekveringen av codeB. 3. Efter exekvering av codeB, släpp objektA, och codeB kan nås av andra trådar.
2. Vad hände med låset (detta)?
Låt oss titta på ett exempel:
I t1-tråden anropar LockMe lock(this), det vill säga c1 i huvudfunktionen, och när lock(c1) anropas i huvudtråden måste den vänta på att lockblocket i t1 ska exekveras innan den kan komma åt c1, det vill säga alla c1-relaterade operationer kan inte slutföras, så vi ser att även c1. DoNotLockMe() körs inte.
|