尝试锁定对象时尝试/捕获

时间:2015-10-21 06:09:37

标签: c# multithreading

我是多线程新手。当它被另一个线程锁定时我试图锁定对象,我期待一个错误并尝试使用Exception但它没有用。

class Program
    {
        static readonly object lockNum = new object();
        static int A = 10;

        public static void Thread1()
        {
            lock (lockNum)
            {
                A = 100;
                Console.WriteLine(A);
            }
        }

        public static void Thread2()
        {
            Thread.Sleep(1000);
            lock (lockNum)
            {
                Thread.Sleep(9000);
                Console.WriteLine(A);
                Console.WriteLine("Thread 2 is executed");
            }
        }

        public static void Thread3()
        {
            Thread.Sleep(3000);

            try
            {
                lock (lockNum)
                {
                    Console.WriteLine(A);
                    Console.WriteLine("Thread 3 is executed");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine("Object is locked");
            }

        }

    }

    public class MyClass
    {

        public static void Main()
        {
            Thread tid1 = new Thread(new ThreadStart(Program.Thread1));
            Thread tid2 = new Thread(new ThreadStart(Program.Thread2));
            Thread tid3 = new Thread(new ThreadStart(Program.Thread3));

            tid1.Start();
            tid2.Start();
            tid3.Start();

            Console.ReadLine();
        }
    }

线程2和线程3在Thread.Sleep(9000);之后一起运行我希望3秒后出现异常,因为该对象仍然被Thread2锁定。我试图让Thread3再次休眠3秒以检查对象是否已解锁(可能是WriteLine错误)并重复直到对象被解锁。

2 个答案:

答案 0 :(得分:2)

锁定不会抛出异常,它们只是等到另一个线程释放锁定。

如果您希望在无法声明lock的情况下跳过代码,则可以使用

if (Monitor.TryEnter(lockNum))
{
    Console.WriteLine("No one else had the lock, now it's mine!");
}
else
{
    Console.WriteLine("Another thread won :(");
}

您可以选择为该方法提供超时。

答案 1 :(得分:2)

您的代码应如下所示:

public static void Thread3()
    {
        Thread.Sleep(3000);

        try
        {
            if (Monitor.TryEnter(lockNum))
            {
                Console.WriteLine(A);
                Console.WriteLine("Thread 3 is executed");
            }
            else throw new Exception();
        }
        catch (Exception ex)
        {
            Console.WriteLine("Object is locked");
        }

    }

EDIT1:唉......解释是由另一个人提供的,

EDIT2:实际上这不是处理它的最好方法。例外情况很严重。你可以摆脱try catch块而不是抛出异常,你可以打印出你的消息。