Om din kod är i en process som har flera trådar igång samtidigt, kan den köra koden samtidigt. Om resultatet av varje körning är detsamma som för en enskild tråd, och värdena för andra variabler är desamma som förväntat, är det trådsäkert. Med andra ord är gränssnittet som tillhandahålls av en klass eller ett program atomärt för trådar eller att byta mellan flera trådar leder inte till tvetydighet i gränssnittets exekveringsresultat, vilket innebär att vi inte behöver ta hänsyn till synkronisering. Trådsäkerhetsproblem orsakas av både globala och statiska variabler. Om varje tråd endast har läsoperationer för globala variabler och statiska variabler, men inga skrivoperationer, är denna globala variabel generellt sett trådsäker; Om flera trådar utför läs- och skrivoperationer på en variabel samtidigt krävs vanligtvis trådsynkronisering, annars kan det påverka trådsäkerheten.
Syftet med låset är att förhindra samtidiga operationer vid multitrådad exekvering, och objekt av referenstypen lås tillåter endast en tråd åt gången i sitt låsta område.
Lock kan bara låsa en referenstypvariabel, det vill säga låsa en adress
Det finns en skillnad mellan resultaten av att köra med och utan låsning:
Efter låsning: värdet på i minskar en efter en, inga hopp, ingen upprepad utmatning, tills värdet 0;
Ingen låsning: värdeutgången av i hoppar, avtar diskontinuerligt, och kan även ha ett -1-värde utdata;
Anledning: Efter att ha lagt till ett lås kan endast en tråd exekvera koden i det låsta området åt gången, och båda trådarna körs i ordning, så det blir ingen avbruten utdata. |