2016-11-05 3 views
2

Ich arbeite an einer C# Codierung Übung mit diesem Code:Verwendung von Schloss keywork C#

class Program 
{ 
    static object sync = new object(); 

    static void SafeRun() 
    { 
     lock (sync) 
     { 
       Thread.Sleep(1000); 
     } 
    } 

    static void Main(string[] args) 
    { 
     lock (sync) 
     { 
       SafeRun(); 
     } 

     Console.Write("Safe"); 
    } 
    } 
} 

Was gedruckt wird?

  1. Nichts, ein Deadlock tritt auf.
  2. Es kompiliert nicht.
  3. "Sicher" wird gedruckt.

Ich dachte, dass Deadlock auftreten wird, aber wenn ich den Code ausführen "Safe" wird gedruckt.

Also, können Sie mir erklären, warum 3 richtig ist und warum 1 nicht korrekt ist?

Vielen Dank!

+2

In diesem Programm läuft nur ein Thread, der Hauptthread, auf die Synchronisierungsressource wird zweimal zugegriffen, aber auf den gleichen Thread, so dass keine Deadlock-Situation entsteht. –

+0

Führen Sie das Programm aus und sehen Sie, was gedruckt wird: Das sind Ihre Hausaufgaben, oder? BTW wird es drucken "Safe" – CodingYoshi

Antwort

2

Ihr Programm wird einziger Thread ein, so ist es Thread-sicher standardmäßig (um eine Deadlock, Race-Bedingung ect. Sie haben mindestens zwei Fäden haben). Alle lock s sind in der Tat nichts tun - es gibt keine anderen Threads zu sperren (deshalb können alle lock gelöscht werden).

static void Main(string[] args) 
{ 
    lock (sync) // does nothing (no other treads to lock) 
    { 
     SafeRun(); // execution 
    } 

    Console.Write("Safe"); // printing out 
} 

static void SafeRun() 
{ 
    lock (sync) // does nothing (no other treads to lock) 
    { 
      Thread.Sleep(1000); // 1 second pause 
    } 
} 

Sie Programm nur

  • Start
  • Anruf SafeRun()
  • 1 Sekunde warten
  • Druck "Safe"
3

Für deadlock out Sie mindestens 2 auftreten müssen Threads, die auf Ressourcen zugreifen möchten, die zwischen ihnen gesperrt sind.

Beispiel:

Sie haben 2 Thread und 2 List<T> läuft.

Thread A ist gesperrt die List A. Der Thread A wollen Wert nehmen von List B

Thread B ist die List B gesperrt. Die Thread B möchten Wert von List A

nehmen Jetzt werden beide Threads versuchen, Ressourcen zu erhalten, die zwischen ihnen gesperrt sind.

1

Das Schlüsselwort lock wird verwendet, um den Zugriff einer bestimmten Ressource durch andere Threads einzuschränken. Da Ihre Anwendung nicht mehrere Threads verwendet, ist es unmöglich, dass ein Deadlock auftritt.