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 中文翻译作者把原文放在了& ...
随机推荐
- mysql导sql脚本
在navicat或sql yog ,或dos窗口中,如下 命令 ->mysql source d:\test.sql;
- [原创]java WEB学习笔记87:Hibernate学习之路-- -映射 继承关系(subclass , joined-subclass,union-subclass )
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- [转] JVM 调优系列 & 高并发Java系列
1.JVM调优总结(1):一些概念:http://www.importnew.com/18694.html 2.JVM调优总结(2):基本垃圾回收算法:http://www.importnew.com ...
- HDU 3308 LCIS(线段树)
Problem Description Given n integers.You have two operations:U A B: replace the Ath number by B. (in ...
- POJ 3243 Clever Y(离散对数-拓展小步大步算法)
Description Little Y finds there is a very interesting formula in mathematics: XY mod Z = K Given X, ...
- 杭电1241 Oil Deposits
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission ...
- AP模块的发票过账后关联对应的凭证编号。
--AP发票 SELECT GJH.NAME,GJH.LEDGER_ID,GJH.JE_CATEGORY, GJH.JE_SOURCE,XDL.SOURCE_DISTRIBUTION_TYPE, XT ...
- springmvc下上传文件
使用ajax+表单+jQuery: function sendFile() { var action = "c/goFile.do"; $("#form").a ...
- beta阶段组间的140字互评
第一名:连连看 理由:此项目组的技术难度最大,而且在游戏背景和界面上有很大的改进,观赏性和趣味性很足. 第二名:新蜂 理由:俄罗斯方块游戏能运行,新增加了暂停和分数显示的功能,就是界面不是很美观. 第 ...
- expandlistview
package com.exaple.zhonghe2; import java.sql.SQLData;import java.util.ArrayList;import java.util.Has ...