Thread Synchronization


using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

/*When we have multiple threads that share data, we need to provide synchronized access to the data. 
 * We have to deal with synchronization issues related to concurrent access to variables and objects accessible 
 * by multiple threads at the same time. This is controlled by giving one thread a chance to acquire a lock on the shared resource at a time*/
class SyncThread
{
    static void Main(string[] args)
    {
        Launcher la = new Launcher();

        Thread firstThread = new Thread(new ThreadStart(la.Coundown));
        Thread secondThread = new Thread(new ThreadStart(la.Coundown));
        Thread thirdThread = new Thread(new ThreadStart(la.Coundown));

        firstThread.Start();
        secondThread.Start();
        thirdThread.Start();

        Console.ReadLine();
    }
}

class Launcher
{
    public void Coundown()
    {
        lock (this)
        {
            Console.WriteLine("Thread has started");
            for (int i = 2; i >= 0; i--)
            {
                Console.WriteLine("{0} Seconds to Finish", i);
                Thread.Sleep(1000);
            }

            Console.WriteLine("Finished !!!");
        }
    }
}

Output:
Thread has started
Seconds to Finish
Seconds to Finish
Seconds to Finish
Finished !!!
Thread has started
Seconds to Finish
Seconds to Finish
Seconds to Finish
Finished !!!
Thread has started
Seconds to Finish
Seconds to Finish
Seconds to Finish
Finished !!!