同步ReaderWriterLockSlim
2015-06-02 07:10
537 查看
使用方法:
1.在方法之外添加 ReaderWriterLockSlim类.
2.使用try语句。注意write与read不同。
写
try
{
while (!rwl.TryEnterWriteLock(50))//没有获取到写锁
{
//do other something
}
rwl.EnterReadLock();
//do something
}
finally
{
rwl.ExitWriteLock();
}
读
try
{
rwl.EnterReadLock();
//批量读取公共变量
do something;
}
finally
{
rwl.ExitReadLock();
}
样例代码:
class Program
{
private static ReaderWriterLockSlim rwl = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);//声明静态类,支持递归方式.
private static List<int> testData = new List<int>(){0,1,2,3,4,5};
static void Main(string[] args)
{
var Tasks = new Task[3];
var taskfactory = new TaskFactory(TaskCreationOptions.LongRunning,TaskContinuationOptions.None);
Tasks[0] = taskfactory.StartNew(ReadMethod ,1);
Tasks[1] = taskfactory.StartNew(WriteMethod, 2);
Tasks[2] = taskfactory.StartNew(ReadMethod, 3);
Console.ReadKey();
}
static void WriteMethod(object identification)
{
try
{
while (!rwl.TryEnterWriteLock(50))//没有获取到写锁
{
Console.WriteLine("don't get writeLock");
Console.WriteLine("Current reader count:{0}",rwl.CurrentReadCount);
}
rwl.EnterReadLock();
//写公共变量
for (int i = 0; i < testData.Count; i++)
{
testData[i]+=6;
}
Console.WriteLine("{0} writer is finished", identification);
ReadMethod(55);
}
finally
{
rwl.ExitWriteLock();
}
}
static void ReadMethod(object identification)
{
try
{
rwl.EnterReadLock();
//批量读取公共变量
for (int i = 0; i < testData.Count; i++)
{
Console.WriteLine("{0} reading {1},Current value is {2}", identification, i, testData[i]);
Thread.Sleep(10);
}
}
finally
{
rwl.ExitReadLock();
}
}
}
1.在方法之外添加 ReaderWriterLockSlim类.
2.使用try语句。注意write与read不同。
写
try
{
while (!rwl.TryEnterWriteLock(50))//没有获取到写锁
{
//do other something
}
rwl.EnterReadLock();
//do something
}
finally
{
rwl.ExitWriteLock();
}
读
try
{
rwl.EnterReadLock();
//批量读取公共变量
do something;
}
finally
{
rwl.ExitReadLock();
}
样例代码:
class Program
{
private static ReaderWriterLockSlim rwl = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion);//声明静态类,支持递归方式.
private static List<int> testData = new List<int>(){0,1,2,3,4,5};
static void Main(string[] args)
{
var Tasks = new Task[3];
var taskfactory = new TaskFactory(TaskCreationOptions.LongRunning,TaskContinuationOptions.None);
Tasks[0] = taskfactory.StartNew(ReadMethod ,1);
Tasks[1] = taskfactory.StartNew(WriteMethod, 2);
Tasks[2] = taskfactory.StartNew(ReadMethod, 3);
Console.ReadKey();
}
static void WriteMethod(object identification)
{
try
{
while (!rwl.TryEnterWriteLock(50))//没有获取到写锁
{
Console.WriteLine("don't get writeLock");
Console.WriteLine("Current reader count:{0}",rwl.CurrentReadCount);
}
rwl.EnterReadLock();
//写公共变量
for (int i = 0; i < testData.Count; i++)
{
testData[i]+=6;
}
Console.WriteLine("{0} writer is finished", identification);
ReadMethod(55);
}
finally
{
rwl.ExitWriteLock();
}
}
static void ReadMethod(object identification)
{
try
{
rwl.EnterReadLock();
//批量读取公共变量
for (int i = 0; i < testData.Count; i++)
{
Console.WriteLine("{0} reading {1},Current value is {2}", identification, i, testData[i]);
Thread.Sleep(10);
}
}
finally
{
rwl.ExitReadLock();
}
}
}
相关文章推荐
- crtmpserver实现防盗流和流推送验证
- jquery自学篇-选择器
- crtmpserver流媒体服务器的介绍与搭建
- Sicily 14551. Jury Jeopardy
- crtmpserver流媒体服务器的介绍与搭建
- RTMP流媒体服务器 crtmpserver
- 百度联盟代扣个人所得税计算方法
- red5-server源码:https://github.com/Red5/red5-server
- RTMP流媒体服务器 crtmpserver
- spring--两个数据源模板
- spring--两个数据源模板
- red5-server源码
- OSChina 周二乱弹 —— 土豪是这么过儿童节的
- C++实现RTMP协议发送H.264编码及AAC编码的音视频
- iOS使用矢量图的总结
- C++实现RTMP协议发送H.264编码及AAC编码的音视频
- 天题系列: Wildcard Matching
- gdb基本命令总结
- JSP基础
- 课堂作业