【发布时间】:2011-05-12 20:20:14
【问题描述】:
当多个线程请求同一个对象上的锁时,CLR 是否保证将按照请求的顺序获取锁?
我写了一个测试看看这是不是真的,它似乎表明是的,但我不确定这是否是确定的。
class LockSequence
{
private static readonly object _lock = new object();
private static DateTime _dueTime;
public static void Test()
{
var states = new List<State>();
_dueTime = DateTime.Now.AddSeconds(5);
for (int i = 0; i < 10; i++)
{
var state = new State {Index = i};
ThreadPool.QueueUserWorkItem(Go, state);
states.Add(state);
Thread.Sleep(100);
}
states.ForEach(s => s.Sync.WaitOne());
states.ForEach(s => s.Sync.Close());
}
private static void Go(object state)
{
var s = (State) state;
Console.WriteLine("Go entered: " + s.Index);
lock (_lock)
{
Console.WriteLine("{0,2} got lock", s.Index);
if (_dueTime > DateTime.Now)
{
var time = _dueTime - DateTime.Now;
Console.WriteLine("{0,2} sleeping for {1} ticks", s.Index, time.Ticks);
Thread.Sleep(time);
}
Console.WriteLine("{0,2} exiting lock", s.Index);
}
s.Sync.Set();
}
private class State
{
public int Index;
public readonly ManualResetEvent Sync = new ManualResetEvent(false);
}
}
打印:
进入:0
0 被锁定
0 睡眠 49979998 滴答
进入:1
进入:2
进入:3
进入:4
进入:5
进入:6
进入:7
进入:8
进入:9
0 退出锁定
1 被锁定
1 睡眠 5001 滴答声
1 个退出锁
2 被锁定
2 睡眠 5001 滴答声
2 退出锁
3 被锁定
3 睡眠 5001 滴答声
3 退出锁
4 被锁定
4 睡眠 5001 滴答声
4 退出锁
5 被锁定
5 睡眠 5001 滴答声
5 退出锁
6 被锁定
6 退出锁
7 被锁定
7 退出锁
8 被锁定
8 退出锁
9 被锁定
9 退出锁
【问题讨论】:
标签: c# .net synchronization locking