
.Net ReaderWriterLockSlim 锁
读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁。
public class ReadWriteLockDemo
{
public static ReaderWriterLockSlim readerwritelock = new ReaderWriterLockSlim();
public static long i =0;
public void Read(long value)
{
readerwritelock.EnterReadLock();
Thread.Sleep(5000);
Debug.WriteLine($"Thread ID :{Thread.CurrentThread.ManagedThreadId} Read Lock Value:{i} Time:{DateTime.Now}");
readerwritelock.ExitReadLock();
}
public void Write(long value)
{
readerwritelock.EnterWriteLock();
Thread.Sleep(5000);
i = value;
Debug.WriteLine($"Thread ID :{Thread.CurrentThread.ManagedThreadId} Write Lock Value:{i} Time:{DateTime.Now}");
readerwritelock.ExitWriteLock();
}
public void Read(long value,int millisecondsTimeout)
{
//三秒内没执行将会自动释放
bool islock = readerwritelock.TryEnterReadLock(millisecondsTimeout);
if (islock)
{
Thread.Sleep(5000);
Debug.WriteLine($"Thread ID :{Thread.CurrentThread.ManagedThreadId} Read Lock Value:{i} Time:{DateTime.Now} IsLock:{islock}");
readerwritelock.ExitReadLock();
}
}
public void Write(long value, int millisecondsTimeout)
{
bool islock = readerwritelock.TryEnterWriteLock(millisecondsTimeout);
if (islock)
{
Thread.Sleep(5000);
i = value;
Debug.WriteLine($"Thread ID :{Thread.CurrentThread.ManagedThreadId} Write Lock Value:{i} Time:{DateTime.Now} IsLock:{islock}");
readerwritelock.ExitWriteLock();
}
}
}
场景一
只要前面那个写入线程没有释放,每次写都需要阻塞(排队等)。(10个读写线程,每次处理需要花5秒)
[Test]
public void TestReadWriteLock()
{
ReadWriteLockDemo readWriteLockDemo = new ReadWriteLockDemo();
List<Task> list = new List<Task>();
for (int i = 0; i < 10; i++)
{
int a = i;
Task task = new Task(() => {
readWriteLockDemo.Write(a);
readWriteLockDemo.Read(a);
});
task.Start();
list.Add(task);
}
Task.WaitAll(list.ToArray());
}
场景二
只要前面那个写入线程没有释放,它叫我和其他线程等它3秒钟,3秒等完了还是没处理完我们走了,3秒内处理完了轮到我了我就上,或者轮到其他线程那个线程上,我们走了。
[Test]
public void TestReadWriteLockTimeOut()
{
ReadWriteLockDemo readWriteLockDemo = new ReadWriteLockDemo();
List<Task> list = new List<Task>();
for (int i = 0; i < 10; i++)
{
int a = i;
Task task = new Task(() => {
readWriteLockDemo.Write(a,3000);
readWriteLockDemo.Read(a, 3000);
});
task.Start();
list.Add(task);
}
Task.WaitAll(list.ToArray());
}
我们这里改改,我们不急可以等100秒.这样我们就都可以等到处理完成。
readWriteLockDemo.Write(a,100000);
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739
评价
排名
2
文章
634
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 :
好是好,这个对效率影响大不大哇,效率高不高
一个bug让程序员走上法庭 索赔金额达400亿日元
剑轩 : 有点可怕
ASP.NET Core 服务注册生命周期
剑轩 :
http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:
50010702506256


欢迎加群交流技术