c# ReaderWriterLock类
先前也知道,Monitor实现的是在读写两种情况的临界区中只可以让一个线程访问,那么如果业务中存在”读取密集型“操作,就
好比数据库一样,读取的操作永远比写入的操作多。针对这种情况,我们使用Monitor的话很吃亏,不过没关系,ReadWriterLock
就很牛X,因为实现了”写入串行“,”读取并行“。
ReaderWriteLock中主要用3组方法:
<1> AcquireWriterLock: 获取写入锁。
ReleaseWriterLock:释放写入锁。
<2> AcquireReaderLock: 获取读锁。
ReleaseReaderLock:释放读锁。
<3> UpgradeToWriterLock:将读锁转为写锁。
DowngradeFromWriterLock:将写锁还原为读锁。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace ConsoleApplication3
{
class Program
{
static List<int> list = new List<int>(); static ReaderWriterLock rw = new System.Threading.ReaderWriterLock(); static void Main(string[] args)
{
Thread t1 = new Thread(AutoAddFunc); Thread t2 = new Thread(AutoReadFunc); t1.Start(); t2.Start(); Console.Read();
}
public static void AutoAddFunc()
{
//3000ms插入一次
Timer timer1 = new Timer(new TimerCallback(Add), null, 0, 3000);
} public static void AutoReadFunc()
{
//1000ms自动读取一次
Timer timer1 = new Timer(new TimerCallback(Read), null, 0, 1000);
Timer timer2 = new Timer(new TimerCallback(Read), null, 0, 1000);
Timer timer3 = new Timer(new TimerCallback(Read), null, 0, 1000);
} public static void Add(object obj)
{
var num = new Random().Next(0, 1000); //写锁
rw.AcquireWriterLock(TimeSpan.FromSeconds(30)); list.Add(num); Console.WriteLine("我是线程{0},我插入的数据是{1}。", Thread.CurrentThread.ManagedThreadId, num); //释放锁
rw.ReleaseWriterLock();
} public static void Read(object obj)
{
//读锁
rw.AcquireReaderLock(TimeSpan.FromSeconds(30)); Console.WriteLine("我是线程{0},我读取的集合为:{1}",
Thread.CurrentThread.ManagedThreadId, string.Join(",", list));
//释放锁
rw.ReleaseReaderLock();
}
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Timers; namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public List<int> list = new List<int>();
public ReaderWriterLock rw = new ReaderWriterLock();
private void button1_Click(object sender, EventArgs e)
{
//读取
Thread t1 = new Thread(add); Thread t2 = new Thread(read); t1.Start(); t2.Start(); timer1.Enabled = true;
timer2.Enabled = true; } public void add(object obj)
{
//var num = new Random().Next(0, 1000);
Thread.Sleep(30);
Random r = new Random(); List<int> l = new List<int>();
for (int j = 0; j < 6; j++)
{
int lable = r.Next(1, 34);
if (l.Contains(lable))
{
j--;
}
else
{
l.Add(lable);
}
} l.Sort();
int lan = r.Next(1, 17);
string zu = l[0].ToString() + " " + l[1].ToString() + " " + l[2].ToString() + " " + l[3].ToString() + " " + l[4].ToString() + " " + l[5].ToString() + "-" + lan; //写锁
rw.AcquireWriterLock(TimeSpan.FromSeconds(30)); listBox1.Items.Add(zu); //释放锁
rw.ReleaseWriterLock(); } public void read(object obj)
{
rw.AcquireReaderLock(TimeSpan.FromSeconds(30));
for (int i = 0; i < listBox1.Items.Count; i++)
{
textBox1.Text = string.Join(",", listBox1.Items[i].ToString());
} //释放锁
rw.ReleaseReaderLock(); } private void timer2_Tick(object sender, EventArgs e)
{
read(null);
read(null);
read(null);
} private void Form1_Load(object sender, EventArgs e)
{
Control.CheckForIllegalCrossThreadCalls = false;
} private void timer1_Tick(object sender, EventArgs e)
{
add(null);
}
}
}
c# ReaderWriterLock类的更多相关文章
- C#多线程:使用ReaderWriterLock类实现多用户读/单用户写同步
摘要:C#提供了System.Threading.ReaderWriterLock类以适应多用户读/单用户写的场景.该类可实现以下功能:如果资源未被写操作锁定,那么任何线程都可对该资源进行读操作锁定, ...
- ReaderWriterLock类(转)
ReaderWriterLock类 通常来讲,一个类型的实例对于并行的读操作是线程安全的,但是并行地更新操作则不是(并 行地读和更新也不是). 这对于资源也是一样的,比如一个文件.当保护类型的实例安全 ...
- 使用ReaderWriterLock类实现多用户读/单用户写同步
使用ReaderWriterLock类实现多用户读/单用户写同步[1] 2015-03-12 应用程序在访问资源时是进行读操作,写操作相对较少.为解决这一问题,C#提供了System.Threadin ...
- 【转】【Thread】ReaderWriterLock 读写锁
ReaderWriterLock类 通常来讲,一个类型的实例对于并行的读操作是线程安全的,但是并行地更新操作则不是(并行地读和更新也不是). 这对于资源也是一样的,比如一个文件.当保护类型的实例安全时 ...
- C#必须掌握的系统类
系统类 Type类,Object类,String类, Arrary类,Console类, Exception类,GC类, MarshalByRefObject类, Math类. DateTime结构 ...
- C#多线程---ReaderWriterLock实现线程同步
一.简介 当我们需要对一个共享资源多次读取的时候,用前面Monitor的同步锁就没有必要了.因为同步锁每次只允许一个线程访问共享资源,其他线程都会阻塞. 此时,通过ReaderWriterLock类可 ...
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- C#线程入门---转载
C#中的线程(一)入门 文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari, 翻译 Swanky Wu 中 ...
- C#中的线程(一)入门
文章系参考转载,英文原文网址请参考:http://www.albahari.com/threading/ 作者 Joseph Albahari, 翻译 Swanky Wu 中文翻译作者把原文放在了& ...
随机推荐
- 在struts里使用Kindeditor注意事项
struts配置文件里 <filter-mapping> <filter-name>struts2</filter-name> ...
- 《30天自制操作系统》07_day_学习笔记
harib04a: P126 获取按键编码: 让程序在按下键盘的键之后,将键值编码显示出来 修改的是前面编写的鼠标按键的处理键盘中断的函数inthandler21() 这里笔者介绍了怎样把中断号 ...
- dlopen、dlsym和dlclose的使用
在dlopen()函数以指定模式打开指定的动态链接库文件,并返回一个句柄给dlsym()的调用进程.使用dlclose()来卸载打开的库. dlopen: dlopen() The function ...
- 仅使用处理单个数字的I/O例程,编写一个过程以输出任意实数(可以是负的)
题目取自:<数据结构与算法分析:C语言描述_原书第二版>——Mark Allen Weiss 练习1.3 如题. 补充说明:假设仅有的I/O例程只处理单个数字并将其输出到终端,我们将这 ...
- c语言的一些库
1利用DEv编程的时候遇见sleep函数 ..注意S大写,并添加#include<windows.h>.
- Error applying BeanValidation relational constraints 错误解决
来自http://blog.csdn.net/sivyer123/article/details/9185325 在hibernate.hbm.xml中加上 <property name=&qu ...
- Codeforce Round #213 Div2
哎,弄了半天这次的C还是没出,真是捉急!,还TM的以为前几次只是运气不好!太逗了!
- 序列变换(hdu5248)
序列变换 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- 认真学习shell的第一天-数学运算
shell中的数学运算有三种方式: (1)let,用let的时候,变量名称前不用添加$ (2)[],[]中变量可使用也可不使用$ (3)(())变量名之前必须添加$
- javaapi中的排序
有的时候需要对数组里的element进行排序.当然可以自己编写合适的排序方法,但既然java包里有自带的Arrays.sort排序方法,在 数组元素比较少的时候为何不用? Sorting an Arr ...