Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 18907|Svar: 0

[Kilde] låse Hvorfor kan kun låse referencen, men ikke værditypen

[Kopier link]
Opslået på 08/12/2016 10.43.37 | | |

Hvis du sender en værditype, vil den blive bokset, og næste gang koden kører her, vil den blive bokset igen, og det vil ikke være det samme objekt to gange, så det kan ikke låses



lock(x)
{
  ...
}

Låsen udføres faktisk via Monitor-objektet:

Ovenstående svarer til:

System.Objekt obj = (System.Objekt)x;
System.Threading.Monitor.Enter(obj);
Prøv
{
  ...   
}
endelig
{
  System.Threading.Monitor.Exit(obj);
}

Så for at citere de oprindelige ord fra MSDN:
Brug Monitor til at låse objekter (dvs. referencetyper), ikke værdityper. Når du sender en værditypevariabel til Enter, bliver den bokset som et objekt. Hvis du sender den samme variabel til Enter igen, bliver den bokset som et separat objekt, og thethread blokerer ikke. I dette tilfælde er den kode, som Monitor angiveligt skal beskytte, ikke beskyttet. Desuden, når du sender variablen til Exit, oprettes endnu et separat objekt. Fordi objektet, der sendes til Exit, er forskelligt fra objektet, der sendes til Enter, kaster Monitor SynchronizationLockException. For mere information, se det konceptuelle emne Monitors.




Tidligere:Opgrader Python 2.6.6 til 2.7.5 på Centos 6.4-systemet
Næste:Forskellen mellem Directory.GetCurrentDirectory og Application.StartupPath
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com