Als je code in een proces zit waarbij meerdere threads tegelijk draaien, kan het zijn dat de code tegelijkertijd draait. Als het resultaat van elke run hetzelfde is als dat van een enkele thread, en de waarden van andere variabelen hetzelfde zijn als verwacht, is het thread safe. Met andere woorden, de interface die door een klasse of programma wordt geleverd is atomair voor threads of het wisselen tussen meerdere threads leidt niet tot ambiguïteit in het uitvoeringsresultaat van de interface, wat betekent dat we geen rekening hoeven te houden met synchronisatie. Threadveiligheidsproblemen worden veroorzaakt door zowel globale als statische variabelen. Als elke thread alleen leesoperaties heeft voor globale en statische variabelen, maar geen schrijfoperaties, is deze globale variabele over het algemeen thread-veilig; Als meerdere threads tegelijkertijd lees- en schrijfoperaties uitvoeren op een variabele, is threadsynchronisatie meestal vereist, anders kan dit de threadbeveiliging beïnvloeden.
Het doel van lock is om gelijktijdige bewerkingen te voorkomen bij multithreaded uitvoering, en objecten van het referentietype lock laten slechts één thread tegelijk in het vergrendelde gebied opereren.
Lock kan slechts één referentietypevariabele vergrendelen, namelijk een adres vergrendelen
Er is een verschil tussen de resultaten van het draaien met en zonder locking:
Na het vergrendelen: de waarde van i zal één voor één dalen, er zullen geen sprongen zijn, geen herhaalde output, tot de waarde van 0;
Geen lock: de waarde output van i springt, discontinu afnemend, en kan ook een -1 waarde uitvoer hebben;
Reden: Na het toevoegen van een lock kan slechts één thread tegelijk de code in het vergrendelde gebied uitvoeren, en beide threads worden in volgorde uitgevoerd, dus er zal geen onderbroken output zijn. |