title: c# Multi-threads with Locks on Queues
body: <p>The code below is an example on multi-threading that the prof presented in class. I am new to coding (first course). I have read on multi-threading and using locks. Reading the theory is fun. var fun = Theory.Read(multi-threading); Actually coding threads and locks seems to baffle me.<br>
  Trying to understand how the two threads in the code below will behave. From testing the code it looks like lock1 will not release and message2 is not enqueue-ed, but I might be wrong. Looks like there is a synchronization issue. Is this an example of a deadlock? 
  I am also wondering why locks and threads are required if two different queues are used. I am not seeing a shared resource. 
  Is there a way to fix this code to prevent the synchronization issue?        </p>
  
  <pre><code>private static object Lock1 = new object(); // Protect MessageQueueOne
  private static object Lock2 = new object(); // Protect MessageQueueTwo
  private static Queue&lt;string&gt; MessageQueueOne = new Queue&lt;string&gt;();
  private static Queue&lt;string&gt; MessageQueueTwo = new Queue&lt;string&gt;();
  
  private static void AddMessages(string message1, string message2)
  {
      lock (Lock1)
      {
          // (1) Thread 1 is here...
          MessageQueueOne.Enqueue(message1);
  
          lock (Lock2)
          {
              MessageQueueTwo.Enqueue(message2);
          }
      }
  }
  
  private static void RemoveMessages()
  {
      lock (Lock2)
      {
          if (MessageQueueTwo.Count &gt; 0)
          {
              // (2) Thread 2 is here...
              Console.WriteLine(MessageQueueTwo.Dequeue());
          }
  
          lock (Lock1)
          {
              if (MessageQueueOne.Count &gt; 0)
              {
                  Console.WriteLine(MessageQueueOne.Dequeue());
              }
          }
      }
  }
  
  private static void Main()
  {
      Task taskOne = Task.Run(() =&gt;
      {
          for (int i = 0; i &lt; 100; ++i)
          {
              AddMessages($"Message One: {DateTime.Now}", $"Message Two: {DateTime.UtcNow}");
  
              Thread.Sleep(25);
          }
      });
  
      Task taskTwo = Task.Run(() =&gt;
      {
          for (int i = 0; i &lt; 100; ++i)
          {
              RemoveMessages();
  
              Thread.Sleep(25);
          }
      });
  
      taskOne.Wait();
  
      taskTwo.Wait();
  
      Console.Write("Tasks are finished");
  
      Console.ReadKey();
  }
  </code></pre>