我是多线程新手。当它被另一个线程锁定时我试图锁定对象,我期待一个错误并尝试使用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错误)并重复直到对象被解锁。
答案 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块而不是抛出异常,你可以打印出你的消息。