Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 18907|Vastaus: 0

[Lähde] lock Miksi voi lukita vain viitteen, mutta ei arvotyyppiä

[Kopioi linkki]
Julkaistu 8.12.2016 10.43.37 | | |

Jos välität arvotyypin, se on laatikossa, ja seuraavalla kerralla kun koodi ajetaan tänne, se ruutuu uudelleen, eikä se ole sama objekti kahdesti, joten sitä ei voi lukita



lukko(x)
{
  ...
}

Lukitus tehdään itse asiassa Monitor-objektin kautta:

Yllä oleva vastaa seuraavaa:

System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
yritä
{
  ...   
}
vihdoin
{
  System.Threading.Monitor.Exit(obj);
}

Sitten, lainatakseni MSDN:n alkuperäisiä sanoja:
Käytä Monitoria lukitsemaan objektit (eli viitetyypit), älä arvotyyppejä. Kun siirrät arvotyyppimuuttujan Enterille, se on laatikossa objektina. Jos syötät saman muuttujan Enterille uudelleen, se on erillisenä objektina, eikä thethread estä sitä. Tässä tapauksessa koodi, jota Monitorin oletetaan suojaavan, ei ole suojattu. Lisäksi, kun siirrät muuttujan Exitille, syntyy vielä toinen erillinen objekti. Koska Exitille kulkeva objekti poikkeaa Enteriin siirtyneestä objektista, Monitor heittää SynchronizationLockExceptionin. Lisätietoja löytyy käsitteellisestä aiheesta Monitorit.




Edellinen:Päivitä Python 2.6.6 versioon 2.7.5 Centos 6.4 -järjestelmässä
Seuraava:Ero Directory.GetCurrentDirectoryn ja Application.StartupPathin välillä
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com