Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 18907|Odpoveď: 0

[Zdroj] Zamknúť: Prečo môže zamknúť iba referenciu, ale nie typ hodnoty

[Kopírovať odkaz]
Zverejnené 8. 12. 2016 10:43:37 | | |

Ak odovzdáte typ hodnoty, bude zablokovaný a pri ďalšom spustení kódu sa opäť zablokuje, a nebude to ten istý objekt dvakrát, takže ho nemožno zamknúť



lock(x)
{
  ...
}

Zámok sa v skutočnosti vykonáva cez objekt Monitor:

Vyššie uvedené je ekvivalentné:

System.Object obj = (System.Object)x;
System.Threading.Monitor.Enter(obj);
Skús
{
  ...   
}
nakoniec
{
  System.Threading.Monitor.Exit(obj);
}

Potom, aby som citoval pôvodné slová MSDN:
Na uzamknutie objektov (teda referenčných typov) použite Monitor, nie na hodnotové typy. Keď odovzdáte premennú typu avalue do Enter, označí sa ako objekt. Ak pošlete tú istú premennú do Enter znova, je označená ako samostatný objekt a vlákno sa neblokuje. V tomto prípade kód, ktorý má Monitor údajne chrániť, nie je chránený. Navyše, keď odovzdáte premennú do Exit, vytvorí sa ďalší samostatný objekt. Pretože objekt odoslaný do Exit je odlišný od objektu odoslaného do Enter, Monitor hodí SynchronizationLockException. Pre viac informácií pozri konceptuálnu tému Monitori.




Predchádzajúci:Upgradujte Python 2.6.6 na 2.7.5 na systéme Centos 6.4
Budúci:Rozdiel medzi Directory.GetCurrentDirectory a Application.StartupPath
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com