webForumDet fria alternativet

lock(): scope/deadlock?

2 svar · 465 visningar · startad av Crypth

CrypthMedlem sedan nov. 200612 inlägg
#1

Jag har en statisk klass där jag behöver thread safety, och därmed använder lock() för att få exklusiv tillgång till variabler i klassen. Jag har två frågor angående lock som jag inte kan hitta så mycket information om.

1. lock( typeof(klassnamn)) rekommenderas på ett antal ställen, men låser jag tillgång till alla variabler i klassen? lock(this) fungerar naturligtvis inte eftersom instansiering av en statisk klass inte är tillåtet. Kan jag skapa ett specifikt lås för en metod genom att använda mig av t:ex typeof(metodNr1_LåsObjekt) ?

2. Om jag låser tillgång till hela klassen kommer isåfall följande scenario skapa ett deadlock?

public static class klassnamn
{
  static klassnamn()
  {
    lock(typeof(klassnamn)) klassnamn.metod();
  }
  private static void metod()
  {
    lock(typeof(klassnamn)) //gör något;
  }
}

Hoppas jag är någotsånär tydlig i frågan. Rekommendationer, idéer någon?

emissionMedlem sedan dec. 19996 095 inlägg
#2

Deadlock bör det inte bli, däremot bör man inte låsa på typeof(klassnamn), eller något annat som är publikt tillgängligt. Lås på en statisk medlemsvariabel i stället.

CrypthMedlem sedan nov. 200612 inlägg
#3

Tack, jag fick det hela förklarat för mig ordenligt också. För att förtydliga låser man normalt sett bara det som behövs låsas, som du säger, t:ex en statisk medlemsvariabel om den ändras i en kritisk sektion.

Om många delar skall låsas skapar man i regel en för ändamålet specifik medlemsvariabel av t:ex typen object och låser på det när man ändrar något i en kritisk sektion.

129 ms totalt · 3 externa anrop · cache AV · v20260731051352-full.56cc9887
0 ms — hämta statistik (cache)
0 ms — hämta forumlista (cache)
127 ms — hämta tråd, inlägg och bilagor (db)