《线程安全之ReadWriteLock》
synchronized关键字可以用于修饰方法和对象,被修饰的方法和对象在某一时间内只允许任意一条线程对其进行访问操作,这就是典型的排它锁。那么假设一个对象内部的某个数据类型同时拥有读/写方法时,读操作的权重比例明显高于写操作时,那么为了保证线程安全,我们都会加上synchronized关键字进行修饰,那么程序在并发环境下的吞吐量将会大大降低。因为从理论上来说,并发对同一数据进行写操作时,肯定是非线程安全的,但是读操作却是允许的,因此synchronized关键字并不能满足开发人员的需要。
为了解决上述问题,Java5开始提供读写锁API,也就是ReadWriteLock接口,其派生类为ReentrantReadWriteLock。在并发环境下,当某一个线程正在试图访问对象内部的某一个数据类型的写入方法时,其余线程只能选择阻塞等待。而当某一个线程正在访问对象内部的某一个数据类型的读操作时,尽管其余线程并不可以同时访问这个数据类型的写入方法,但却可以访问读方法,这就读写锁的作用。
示例代码,如下所示:
public class LockTest { public static void main(String[] args) { final Resource r = new Resource(); /* 当触发读锁时,方法只读,不可写 */ // new Thread() { // public void run() { // r.getValue("ThreadA"); // } // }.start(); // new Thread() { // public void run() { // r.getValue("ThreadB"); // } // }.start(); /* 当触发写锁时,方法不可读/写 */ new Thread() { @Override public void run() { r.setValue("ThreadA"); } }.start(); new Thread() { @Override public void run() { r.getValue("ThreadB"); } }.start(); } } class Resource { ReadWriteLock lock = new ReentrantReadWriteLock(); Lock readLock = lock.readLock(); Lock writeLock = lock.writeLock(); public void getValue(String threadName) { try { readLock.lock(); for (int i = 0; i < 100; i++) { System.out.println(threadName + i); } } finally { readLock.unlock(); } } public void setValue(String threadName) { try { writeLock.lock(); System.out.println(threadName + "\tWrite..."); Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } finally { writeLock.unlock(); } } }
相关推荐
主要介绍了Java多线程之readwritelock读写分离的相关内容,文中涉及具体实例代码,具有一定参考价值,需要的朋友可以了解下。
主要介绍了Java多线程编程之读写锁ReadWriteLock用法实例,本文直接给出编码实例,需要的朋友可以参考下
尚硅谷_JUC线程高级_ReadWriteLock 读写锁 ·12. 尚硅谷_JUC线程高级_线程八锁 ·13. 尚硅谷_JUC线程高级_线程池 ·14. 尚硅谷_JUC线程高级_线程调度 ·15. ForkJoinPool 分支合并框架-工作窃取
ReadWriteLock的使用,实际上由于ReadWriteLock是一个接口,所以实际使用的是ReentrantReadWriteLock子类。同时ReadWriteLock的使用其实也是比较简单的,就是读写的锁的使用以及注意事项而已。
3. 读写锁(ReadWriteLock) 4. 系统内核对象 1) 互斥(Mutex), 信号量(Semaphore), 事件(AutoResetEvent/ManualResetEvent)2) 线程池 除了以上的这些对象之外实现线程同步的还可以使用Thread.Join方法。这种方法...
局部变量 rwLock, ReadWriteLock ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、...
一个Windows下C++读写锁的代码,实现共享读,独占写
目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ReadWriteLock倒计数器 CountDownLatch循环栅栏 CyclicBarrier信号量 Semaphore 线程安全 Thread Safety JMM JMM(Java Memory Model)是一种基于计算机内存...
飞扬学院的JAVA学习资料,有需要的的朋友可以下载学习。
读写锁的设计实现等.。。。。。。。。。。。。。。。。。。。。
本文主要描述在C#中线程同步的方法。线程的基本概念网上资料也很多就...3. 读写锁(ReadWriteLock) 4. 系统内核对象 1) 互斥(Mutex), 信号量(Semaphore), 事件(AutoResetEvent/ManualResetEvent) 2) 线程池 除了以上
本文主要描述在C#中线程同步的方法。...读写锁(ReadWriteLock)4.系统内核对象1)互斥(Mutex),信号量(Semaphore),事件(AutoResetEvent/ManualResetEvent)2)线程池除了以上的这些对象之外实现线程同步的还可
在Java中和ReadWriteLock.ReadLock一样,CountDownLatch的本质也是一个"共享锁",这里我们就来详解Java多线程编程中CountDownLatch阻塞线程的方法:
NULL 博文链接:https://itjiehun.iteye.com/blog/842130
主要介绍了Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁,本文讲解了ReentrantLock概况、Lock接口、Lock使用、轮询锁的和定时锁、公平性、可中断获锁获取操作等内容,需要的朋友可以参考下
readwritelock.zipreadwritelock.zip
读写锁源码
博主的多线程文章的测试类-线程创建以及线程控制器 内含创建线程、synchronized、ReentrantLock、ReadWriteLock、CAS、四种引用、并发控制器、volatile
Java并发编程学习宝典(漫画版),Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习...
之所以称之为重⼊锁,就是⼀个线程允许反复进⼊。当然,这⾥的反复仅仅局限于⼀个线程;如 果同⼀个线程多次获锁,那么在释放锁的时候,也必须释放相同次数。如果释放锁的次数多,那么 会得到⼀个java.lang....