To avoid deadlock
you can use  Monitor.TryEnter
 instead of lock.
In the below example, DoWork1 will acquire lock
on staticObjLock2
for 10 Seconds. If lock cannot be acquired it prints a message and return.
Example:-
class Program
    {
        private static object staticObjLock1 = new
object();
        private static object staticObjLock2 = new
object();
        static void Main()
        {
                     Thread
thread1 = new Thread(DoWork1);
            Thread thread2 = new
Thread(DoWork2);
            thread1.Start();
            thread2.Start();
            thread1.Join();
            thread2.Join();
            Console.WriteLine("Processing
done!");
            Console.ReadLine();
         }
        private static void DoWork1()
        {
            lock (staticObjLock1)
            {
                Console.WriteLine("try
to accquire lock on objectB");
                Thread.Sleep(1000);
                if (Monitor.TryEnter(staticObjLock2,
10000))
                {
                    try
                    {
                        // this will never execute
                        Console.WriteLine("in
DoWork2 critical section");
                    }
                    finally
                    {
                        Monitor.Exit(staticObjLock2);
                    }
                }
                else
                {
                    Console.WriteLine("Unable
to acquire lock.");
                }
            }
        }
        private static void DoWork2()
        {
            lock (staticObjLock2)
            {
                Console.WriteLine("try
to accquire lock on objectA");
                //Thread.Sleep(1000);
                lock (staticObjLock1)
                {
                    // this will never execute
                    Console.WriteLine("in
DoWork2 critical section");
                }
            }
        }
    }
No comments:
Post a Comment
Note: only a member of this blog may post a comment.