读写锁学习(1)——ReaderWriterLock学习

读写锁的目的:将读和写分离,可以实现多个用户的读操作,但是写操作只能有一个用户执行。

实例:

using System;
using System.Threading;

namespace ProcessTest
{
    class Program
    {
        static int theResource = 0;
        static ReaderWriterLock rwl = new ReaderWriterLock();

        static void Main(string[] args)
        {
            //分别创建2个读操作线程,2个写操作线程,并启动
            Thread tr0 = new Thread(new ThreadStart(Read));
            Thread tr1 = new Thread(new ThreadStart(Read));
            Thread tr2 = new Thread(new ThreadStart(Write));
            Thread tr3 = new Thread(new ThreadStart(Write));

            tr0.Start();
            tr1.Start();
            tr2.Start();
            tr3.Start();

            ////等待线程执行完毕
            //tr0.Join();
            //tr1.Join();
            //tr2.Join();
            //tr3.Join();

            System.Console.ReadKey();
        }

        //读数据
        static void Read()
        {
            for (int i = 0; i < 3; i++)
            {
                try
                {
                    //申请读操作锁,如果在1000ms内未获取读操作锁,则放弃
                    rwl.AcquireReaderLock(1000);
                    Console.WriteLine("开始读取数据,theResource = {0}", theResource);
                    Thread.Sleep(10);
                    Console.WriteLine("读取数据结束,theResource = {0}", theResource);
                    //释放读操作锁
                    rwl.ReleaseReaderLock();
                }
                catch (ApplicationException)
                {
                    Console.WriteLine("读数据失败");
                }
            }
        }

        //写数据
        static void Write()
        {
            for (int i = 0; i < 3; i++)
            {
                try
                {
                    //申请写操作锁,如果在1000ms内未获取写操作锁,则放弃
                    rwl.AcquireWriterLock(1000);
                    Console.WriteLine("开始写数据,theResource = {0}", theResource);
                    //将theResource加1
                    theResource++;
                    Thread.Sleep(100);
                    Console.WriteLine("写数据结束,theResource = {0}", theResource);
                    //释放写操作锁
                    rwl.ReleaseWriterLock();
                }
                catch (ApplicationException)
                {
                    Console.WriteLine("写数据失败");
                }
            }
        }
    }
}
时间: 2024-10-21 06:31:14

读写锁学习(1)——ReaderWriterLock学习的相关文章

Linux程序设计学习笔记----多线程编程线程同步机制之互斥量(锁)与读写锁

互斥锁通信机制 基本原理 互斥锁以排他方式防止共享数据被并发访问,互斥锁是一个二元变量,状态为开(0)和关(1),将某个共享资源与某个互斥锁逻辑上绑定之后,对该资源的访问操作如下: (1)在访问该资源之前需要首先申请互斥锁,如果锁处于开状态,则申请得到锁并立即上锁(关),防止其他进程访问资源,如果锁处于关,则默认阻塞等待. (2)只有锁定该互斥锁的进程才能释放该互斥锁. 互斥量类型声明为pthread_mutex_t数据类型,在<bits/pthreadtypes.h>中有具体的定义. 互斥量

Java并发学习之十五——使用读写锁同步数据访问

本文是学习网络上的文章时的总结,感谢大家无私的分享. 读写锁重要的是写锁的使用,只用一个入口. 下面是读写锁使用的例子 package chapter2; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class PricesInfo { private int price1; private int price2;

线程学习--(十三)重写锁、读写锁、锁的高级深化

一.Concurrent.util常用类 1.CountDownLacth使用: 他经常用于监听某些初始化操作,等初始化执行完毕后,通知主线程继续工作 package thread3; import java.util.concurrent.CountDownLatch; public class UseCountDownLatch { public static void main(String[] args) { final CountDownLatch countDown = new Co

C#学习笔记---线程同步:互斥量、信号量、读写锁、条件变量

http://www.cnblogs.com/maxupeng/archive/2011/07/21/2112282.html 一.互斥量(mutex) 互斥量本质上是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁. 对互斥量进行加锁以后,任何其它试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁.如果释放互斥锁时有多个线程阻塞,所有在该互斥锁上的阻塞线程都会变成可运行状态,第一个变为运行状态的线程可以对互斥量加锁,其它线程将会看到互斥锁依然被锁住,只能回去再次

读写锁学习(3)——微软源码实现的阅读

以下是微软源码,主要看了申请读锁EnterReadLock().申请写锁EnterWriteLock().释放读锁ExitReadLock().释放写锁ExitWriteLock()这四个方法,在下研究了两天,里面有很多细节问题还是了解的不够透彻,表述如有错误希望各位大神能指点一下,主要是通过myLock置0或置1来判断是否可以申请锁资源,通过threadRWCount这个数据结构来统计线程中存在读写锁的数量,这个数据结构通过LockId这个值来标识区分.用readercount和writerc

skynet源码学习 - 读写锁

skynet 利用内置的原子操作来实现的一个读写锁,重点是理解 "full  memory barrier" ,UNPv2 中利用互斥和条件变量实现的读写锁.前者是在硬件支持的情况下,显得简单明了,站的层次不一样. 源码贴出来: struct rwlock { int write; int read; }; static inline void rwlock_init(struct rwlock *lock) { lock->write = 0; lock->read =

Java读写锁(ReentrantReadWriteLock)学习

什么是读写锁 平时,我们常见的synchronized和Reentrantlock基本上都是排他锁,这些锁在同一时刻只允许一个线程进行访问,哪怕是读操作.而读写锁是维护了一对锁(一个读锁和一个写锁),通过分离读锁和写锁,使得同一时刻可以允许多个读线程访问,但是在写线程进行访问时,所有的读线程和其他写线程均被阻塞. 读写锁的优点 1. 简化了读写交互场景编程的复杂度: 在常见的开发中,我们经常会定义一个共享的用作缓存的数据结构:比如一个大Map,缓存全部的城市Id和城市name对应关系.这个大Ma

多线程学习 读写锁

类ReentranLock具有万川互斥排他的效果,即同一时间只有一个线程在执行ReentrantLock.lock()方法后面的任务.这样虽然保证了实例变量的线程安全性, 但效率却是非常低下的.所以在jdk中提供了一种读写锁ReentrantReadWriteLock类,使它可以加快运行效率,在某些不需要操作实例变量的方法中,完全可以使用读写锁 ReentrantReadWriteLock来提升该方法的代码运行速度. 读写锁表示也有两个锁,一个是读操作相关的锁,也称为共享锁:另一个事写操作相关的

ReentrantReadWriteLock读写锁的使用2

本文可作为传智播客<张孝祥-Java多线程与并发库高级应用>的学习笔记. 这一节我们做一个缓存系统. 在读本节前 请先阅读 ReentrantReadWriteLock读写锁的使用1 第一版 public class CacheDemo { private Map<String, Object> cache = new HashMap<String, Object>(); public static void main(String[] args) { CacheDem