See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 18907|Vastuse: 0

[Allikas] lukk Miks saab lukustada ainult viidet, mitte väärtustüüpi.

[Kopeeri link]
Postitatud 08.12.2016 10:43:37 | | |

Kui sisestad väärtustüübi, pannakse see kasti ja järgmine kord, kui kood siin jookseb, pannakse see uuesti kasti ega ole sama objekt kaks korda, seega ei saa seda lukustada



lock(x)
{
  ...
}

Lukustus toimub tegelikult Monitori objekti kaudu:

Ülaltoodud on ekvivalentne:

System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
proovi
{
  ...   
}
lõpuks
{
  System.Threading.Monitor.Exit(obj);
}

Seejärel tsiteerides MSDN-i algseid sõnu:
Kasuta Monitori, et lukustada objektid (st viitetüübid), mitte väärtustüüpe. Kui sa annad väärtustüübi muutuja Enterile, on see kastis objektina. Kui sa edastad sama muutuja uuesti Enterile, pannakse see eraldi objektiks ja thethread ei blokeeri. Sellisel juhul ei ole kood, mida Monitor peaks kaitsma, kaitstud. Veelgi enam, kui sa annad muutuja Exitile, tekib veel üks eraldi objekt. Kuna objekt, mis edastatakse Väljapääsule, erineb Enterile edastatud objektist, viskab Monitor SynchronizationLockExceptioni. Lisateabe saamiseks vaata kontseptuaalset teemat Monitorid.




Eelmine:Uuenda Python 2.6.6 versioonile 2.7.5 Centos 6.4 süsteemis
Järgmine:Erinevus Directory.GetCurrentDirectory ja Application.StartupPath vahel
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com