当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程就循环等待。
优点:不会使线程进入阻塞状态,没有上下文切换。
缺点:循环等待消耗CPU。
自旋锁(SpinLock)使用场景:
① 多核CPU
② "事务"粒度小,很快处理完成
③ 自旋锁中的代码块不要使用Sleep(),因为一但休眠,就没法再次被自动唤醒。
示例: FCL的自旋锁
using System;
using System.Threading;
namespace SpinLockTest
{
class Program
{
//锁对象不能标记为readonly,因为在操作锁的时候,它的内部状态必须改变。
static SpinLock spinLock = new SpinLock(true);
static void Main(string[] args)
{
Thread myThread;
for (int i = 0; i < 5; i++)
{
myThread = new Thread(new ThreadStart(MyThreadProc));
myThread.Name = String.Format("Thread{0}", i + 1);
myThread.IsBackground = true;
myThread.Start();
}
Console.ReadKey();
}
private static void MyThreadProc()
{
bool lockTaken = false;
spinLock.Enter(ref lockTaken);
if (lockTaken)
{
Console.WriteLine("{0} Thread Taken Lock", Thread.CurrentThread.Name);
}
else
{
Console.WriteLine("{0} Thread Not Taken Lock", Thread.CurrentThread.Name);
}
spinLock.Exit(false);
Console.WriteLine("{0} Thread Exit", Thread.CurrentThread.Name);
}
}
}
运行测试