Ist das Schloss (objlocker) machen dieses Objekt Thread-sicher App breit? Und sind statische Elemente fädeln automatisch sicher?

StackOverflow https://stackoverflow.com/questions/274344

Frage

Wenn Sie sperren ein Objekt, das Objekt in der gesamten Anwendung?

gesperrt ist

Zum Beispiel dieses Ausschnitt aus C # 3.0 in a Nutshell Abschnitt 19.6.1 "Threadsicherheit und .NET Framework-Typs":

static void AddItems(  )
  {
    for (int i = 0; i < 100; i++)
      lock (list)
        list.Add ("Item " + list.Count);

    string[] items;
    lock (list) items = list.ToArray(  );
    foreach (string s in items) Console.WriteLine (s);
  }

Ist die erste Sperre:

lock (list)
        list.Add ("Item " + list.Count);

verhindern ein anderer Thread den Zugriff auf:

lock (list) items = list.ToArray(  );

oder können beide zur gleichen Zeit ausgeführt werden?

Und nicht automatisch die CLR Ihre statischen Methoden Thread-sicher machen? Oder ist, dass bis zu dem Entwickler?

Danke, John

War es hilfreich?

Lösung

class UsefulStuff {
    object _TheLock = new object { };
    public void UsefulThingNumberOne() {
        lock(_TheLock) {
            //CodeBlockA
        }
    }
    public void UsefulThingNumberTwo() {
        lock(_TheLock) {
            //CodeBlockB
        }
    }
}

CodeBlockA CodeBlockB und sind von der Ausführung in der gleichen Zeit in verschiedenen Threads verhindert, weil sie beide auf der gleichen Objektinstanz _TheLock verriegelt sind.

Die Methoden auf _TheLock selbst sind völlig unberührt.

Andere Tipps

Eine andere Sache zu beachten ist, dass statische Konstrukteuren von der Laufzeit in eine Thread-Weise ausgeführt werden. Wenn Sie eine Singleton erstellen und deklarieren es als:

public class Foo
{
    private static Foo instance = new Foo();

    public static Foo Instance
    {
        get { return instance; }
    }
}

Dann wird es THREAD sein. Wenn jedoch instanziiert Sie eine neue Foo innerhalb der Instanz Getter, dann würden Sie Ihre eigenen Thread-Sicherheit schreiben müssen (dh. Sperren ein Objekt)

Die CLR nicht automatisch macht statische Methoden Thread-sicher; Sie müssen es selbst tun.

Sperre (Liste) verwendet, das Objekt als eine Sperre, so dass, wenn ein anderer Thread einen anderen Punkt mit Schloss (list) erreicht hat (mit der gleichen ‚Liste‘ Objekt), wird der andere Thread blockiert, bis der erste Thread die Sperre frei.

klar sein, Schloss (foo) nicht „das foo Objekt sperren“, sondern übernimmt er die Sperre mit dem foo-Objekt zugeordnet, so dass der kritische Abschnitt (die Aussage in dem Konstrukt „lock (o) Anw“) nur läuft, wenn der aktuelle Thread die Sperre erworben hat.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top