班长.PulaseAll抛出错误
本文关键字:错误 出错 PulaseAll 班长 | 更新日期: 2023-09-27 17:54:34
在Monitor.PulaseAll(yyy)抛出错误"Object synchronization method is called from an unsynchronized block of code"
class Program
{
static object yyy = 1;
public static void test(int x)
{
while (true)
{
lock (yyy)
{
Console.WriteLine("T" + x.ToString());
while (x != (int)yyy)
{
Monitor.Wait(yyy);
continue;
}
Console.Write(new string(x.ToString()[0], 20));
yyy = 1 + (int)yyy;
yyy = ((int)yyy == 4) ? 1 : yyy;
Console.WriteLine("------------------------1--");
Monitor.PulseAll(yyy);
Console.WriteLine("------------------------2--");
}
}
}
public static void Main ()
{
Thread t1 = new Thread(new ThreadStart(() => { test(3);}));
Thread t2 = new Thread(new ThreadStart(() => { test(2);}));
Thread t3 = new Thread(new ThreadStart(() => { test(1);}));
t1.Start();
t2.Start();
t3.Start();
while (true)
Thread.Sleep(500);
}
}
这里的错误是更改锁对象
脉冲[所有]你必须有锁。它看起来像你有一个锁,但如果你仔细看,你在代码中重新分配了yyy
,所以这是一个不同的对象。
因此,锁对象通常是readonly
字段。
另外,锁在盒装值类型或字符串上通常是一个坏主意;最合适的锁对象是:
private readonly object syncLock = new object();
(如果需要,还可以添加static
)
作为私有实例可以避免意外的锁冲突;只读可以避免意外的重赋值。