C#线程锁的常用方法
1、Monitor的使用
Monitor.Enter(obj);
//对某个对象进入独占模式
Monitor.Exit(obj);
//对某个对象释放独占模式
Monitor的顺序执行。
可以让一个线程先执行,其他线程随后执行。
//方式1、
//A线程
lock(obj){
//执行操作
Monitor.Pulse(obj);
}
//B线程
lock(obj){
Monitor.Wait(obj);
//执行操作
}
上述方法的问题:如果B先执行,那么会释放锁,然后确保A先执行。如果A先执行。执行完成以后,那么B执行到Monitor.Wait的时候,就会跳出去,等到,形成死锁。
//方式2
private static bool isRun = false;
private static Object obj = new Object();
public void MethodA(){
lock(obj){
//执行操作
isRun = true;
Monitor.Pulse(obj);
}
}
public void MethodB(){
lock(obj){
if(isRunning){
Monitor.Wait(obj);
}
//执行操作
}
}
2、lock(){ }的使用
private static Object obj = new Obj();
lock(obj){
//执行操作
}
3、自旋锁SpinLock
private SpinLock _spinlock = new SpinLock();
public void DoWork(){
_spinlock.Enter(ref lockTaken);
_spinlock.Exit(lockTaken);
}
自旋锁比Monitor在多核cpu的电脑上有优势,通过空转,减少CPU的切换
4、原子锁 Interlocked
Interlocked.Increment(SharedResource.IntValue);
Interlocked.Decrement(SharedResource.IntValue);
//类似的方法
//Add
//CompareExchange
//Read
//Exchange
876

被折叠的 条评论
为什么被折叠?



