webForumDet fria alternativet
Logga in / Bli medlem

lock(): scope/deadlock?

.NET

2 svar · 467 visningar · startad av Crypth

Medlem sedan nov. 200612 inlägg
Frågan#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?

Medlem sedan dec. 19996 721 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.

Medlem 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.

257 ms totalt · 4 externa anrop · v20260731065814-full.14655e19
116 ms — deklarationer (db)
0 ms — hämta statistik (cache)
129 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)