使用ReaderWriterLock类实现多用户读/单用户写同步
使用ReaderWriterLock类实现多用户读/单用户写同步[1]
2015-03-12
应用程序在访问资源时是进行读操作,写操作相对较少。为解决这一问题,C#提供了System.Threading.ReaderWriterLock类以适应多用户读/单用户写的场景。
该类可实现以下功能:如果资源未被写操作锁定,那么任何线程都可对该资源进行读操作锁定,并且对读操作锁数量没有限制,即多个线程可同时对该资源进行读操作锁定,以读取数据。如果资源未被添加任何读或写操作锁,那么一个且仅有一个线程可对该资源添加写操作锁定,以写入数据。简单的讲就是:读操作锁是共享锁,允许多个线程同时读取数据;写操作锁是独占锁,同一时刻,仅允许一个线程进行写操作。
代码如下:
using System;
using System.Threading; namespace ProcessTest
{
class Program
{
//读、写操作锁
static ReaderWriterLock rwl = new ReaderWriterLock(); static void Main(string[] args)
{
//分别创建2个读操作线程,2个写操作线程,并启动
Thread tr0 = new Thread(new ParameterizedThreadStart(Read));
Thread tr1 = new Thread(new ParameterizedThreadStart(Read));
Thread tr2 = new Thread(new ParameterizedThreadStart(Write));
Thread tr3 = new Thread(new ParameterizedThreadStart(Write)); tr0.Start("R0");
tr1.Start("R1");
tr2.Start("W2");
tr3.Start("W3"); //等待线程执行完毕
tr0.Join();
tr1.Join();
tr2.Join();
tr3.Join(); System.Console.ReadKey();
} //读数据
static void Read(object state)
{
for (int i = ; i < ; i++)
{
try
{
//申请读操作锁,如果在1000ms内未获取读操作锁,则放弃
rwl.AcquireReaderLock();
Console.WriteLine("Begin Read,Thread = {0}", state);
Thread.Sleep();
Console.WriteLine("End Read,Thread = {0}", state);
//释放读操作锁
rwl.ReleaseReaderLock();
}
catch (ApplicationException)
{
//获取读操作锁失败的处理
}
}
} //写数据
static void Write(object state)
{
for (int i = ; i < ; i++)
{
try
{
//申请写操作锁,如果在1000ms内未获取写操作锁,则放弃
rwl.AcquireWriterLock();
Console.WriteLine("Begin write,Thread = {0}", state);
Thread.Sleep();
Console.WriteLine("End write,Thread = {0}", state);
//释放写操作锁
rwl.ReleaseWriterLock();
}
catch (ApplicationException)
{
//获取写操作锁失败
}
}
}
}
}
结果如下:

参考:
[1] C#多线程编程之:使用ReaderWriterLock类实现多用户读/单用户写同步
[2] 归纳一下:C#线程同步的几种方法
使用ReaderWriterLock类实现多用户读/单用户写同步的更多相关文章
- C#多线程:使用ReaderWriterLock类实现多用户读/单用户写同步
摘要:C#提供了System.Threading.ReaderWriterLock类以适应多用户读/单用户写的场景.该类可实现以下功能:如果资源未被写操作锁定,那么任何线程都可对该资源进行读操作锁定, ...
- Oracle19c单实例数据库配置OGG单用户数据同步测试
目录 19c单实例配置GoldenGate 并进行用户数据同步测试 一.数据库操作 1.开启数据库附加日志 2.开启数据库归档模式 3.开启goldengate同步 4.创建goldengate管理用 ...
- c++ 多个线程读一个线程写同步
这种情况一般多个线程读是不需要加锁的.就在写的时候需要加锁. 那么要做的就是让不写的时候,读不受同步限制.让多线程自由的读. 这个时候就要用读写锁 boost已经有读写锁,而c++ 14才有读写锁. ...
- SQLSERVER 切换数据库为单用户和多用户模式
有时候数据库在占用时,想做一些操作,无法操作.可以尝试将数据库切换为单用户模式来操作.操作完之后再切换回多用户模式. 命令如下: alter database 数据库名 set Single_user ...
- sqlserver2012一直显示正在还原(Restoring)和从单用户转换成多用户模式(单用户连接中)
如果不需要还原,则使用: restore database test with recovery如果只需要还原,则使用: restore database test with norecovery U ...
- CentOS单用户模式下修改ROOT密码和grub加密
Linux 系统处于正常状态时,服务器主机开机(或重新启动)后,能够由系统引导器程序自动引导 Linux 系统启动到多用户模式,并提供正常的网络服务.如果系统管理员需要进行系统维护或系统出现启动异常时 ...
- centos单用户模式:修改ROOT密码和grub加密
centos单用户模式:修改ROOT密码和grub加密 CentOSLinux网络应用配置管理应用服务器 Linux 系统处于正常状态时,服务器主机开机(或重新启动)后,能够由系统引导器程序自动引导 ...
- CentOS 单用户模式:修改Root密码和grub加密[转]
原文出处: http://zhengdl126.iteye.com/blog/430268 Linux 系统处于正常状态时,服务器主机开机(或重新启动)后,能够由系统引导器程序自动引导 Linux 系 ...
- 烂泥:vsftpd单用户多目录配置
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb. 一.实际问题 在使用vsftpd过程中,我们会经常发现vsftpd在默认情况下一个用户 ...
随机推荐
- Spring Bean 注入 2 注解篇
1. 自动装配注解 配置applicationContext.xml开启注解 <?xml version="1.0" encoding="UTF-8"?& ...
- DGN格式转化为shp格式 【转】
其实本来,我就是需要把一个autocad的dwg/dgn格式的东西导入到google earth里面:但是首先我对dwg/dgn格式的东西根本就不熟:其次我拿到的dwg/dgn格式文件是用的HK80 ...
- 【帧动画总结】AnimationDrawable Frame
Drawable Animation 开发者文档 位置:/sdk/docs/guide/topics/graphics/drawable-animation.html Drawable animati ...
- 【云计算】Docker 多进程管理方案
docker容器内多进程的管理方案 时间 2015-05-08 00:00:00 涯余 ...
- AjaxPro因为汉字文件夹引发的IE兼容性问题
公司一老项目.须要使用AjaxPro.引用dll,config配置,pageload注冊一直都没有问题. google浏览器測试成功. 奇怪的是在IE中英勇的爆掉了... .. 报错: eval(&q ...
- [Firebase] 4. Firebase Object related Database
The idea: This post we are going to learn how to build a Firebase Forage with object related databas ...
- Android之GPS定位详解
一.LocationManager LocationMangager,位置管理器.要想操作定位相关设备,必须先定义个LocationManager.我们可以通过如下代码创建LocationManger ...
- [原创-性能调优]借助AWR报告分析解决oracleCPU过高的问题
简介:在oracle数据库中,有两个非常实用的自带监控工具EM(Enterprise Manager)和AWR(Automatic Workload Repository).其中,通过AWR报告可以生 ...
- Statusbar、Menubar、Toolbar合集
In the last example of this section, we create a menubar, a toolbar and a statusbar. We also create ...
- 〖Fedora〗设置Fedora静态ip地址
root@Fedora:~# cat /etc/sysconfig/network-scripts/ifcfg-eth0 # Intel Corporation 82540EM Gigabit Eth ...