`
gao_xianglong
  • 浏览: 462099 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

线程安全之ReadWriteLock

阅读更多

《线程安全之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读写分离的相关内容,文中涉及具体实例代码,具有一定参考价值,需要的朋友可以了解下。

    Java多线程编程之读写锁ReadWriteLock用法实例

    主要介绍了Java多线程编程之读写锁ReadWriteLock用法实例,本文直接给出编码实例,需要的朋友可以参考下

    尚硅谷Java视频_JUC 视频教程

    尚硅谷_JUC线程高级_ReadWriteLock 读写锁 ·12. 尚硅谷_JUC线程高级_线程八锁 ·13. 尚硅谷_JUC线程高级_线程池 ·14. 尚硅谷_JUC线程高级_线程调度 ·15. ForkJoinPool 分支合并框架-工作窃取

    ReadWriteLock的使用

    ReadWriteLock的使用,实际上由于ReadWriteLock是一个接口,所以实际使用的是ReentrantReadWriteLock子类。同时ReadWriteLock的使用其实也是比较简单的,就是读写的锁的使用以及注意事项而已。

    NET多线程同步方法详解

    3. 读写锁(ReadWriteLock) 4. 系统内核对象 1) 互斥(Mutex), 信号量(Semaphore), 事件(AutoResetEvent/ManualResetEvent)2) 线程池 除了以上的这些对象之外实现线程同步的还可以使用Thread.Join方法。这种方法...

    e语言-易语言线程安全之原子锁与读写锁

    局部变量 rwLock, ReadWriteLock ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 ***注意不要修改本子程序的名称、...

    ReadWriteLock

    一个Windows下C++读写锁的代码,实现共享读,独占写

    详解java多线程的同步控制

    目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ReadWriteLock倒计数器 CountDownLatch循环栅栏 CyclicBarrier信号量 Semaphore 线程安全 Thread Safety JMM JMM(Java Memory Model)是一种基于计算机内存...

    2-ReadWriteLock - Java多线程编程 - 飞扬学院.zip_d_fencebph

    飞扬学院的JAVA学习资料,有需要的的朋友可以下载学习。

    同步 读写锁 readwriteLock

    读写锁的设计实现等.。。。。。。。。。。。。。。。。。。。。

    C#实现多线程的同步方法实例分析

    本文主要描述在C#中线程同步的方法。线程的基本概念网上资料也很多就...3. 读写锁(ReadWriteLock) 4. 系统内核对象 1) 互斥(Mutex), 信号量(Semaphore), 事件(AutoResetEvent/ManualResetEvent) 2) 线程池 除了以上

    C#实现多线程的同步方法详解

    本文主要描述在C#中线程同步的方法。...读写锁(ReadWriteLock)4.系统内核对象1)互斥(Mutex),信号量(Semaphore),事件(AutoResetEvent/ManualResetEvent)2)线程池除了以上的这些对象之外实现线程同步的还可

    详解Java多线程编程中CountDownLatch阻塞线程的方法

    在Java中和ReadWriteLock.ReadLock一样,CountDownLatch的本质也是一个"共享锁",这里我们就来详解Java多线程编程中CountDownLatch阻塞线程的方法:

    将ReadWriteLock应用到缓存设计中

    NULL 博文链接:https://itjiehun.iteye.com/blog/842130

    Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁

    主要介绍了Java并发编程之显示锁ReentrantLock和ReadWriteLock读写锁,本文讲解了ReentrantLock概况、Lock接口、Lock使用、轮询锁的和定时锁、公平性、可中断获锁获取操作等内容,需要的朋友可以参考下

    readwritelock.zip

    readwritelock.zipreadwritelock.zip

    homework-ReadWriteLock-KristampsW-main.zip

    读写锁源码

    ideaworker.zip

    博主的多线程文章的测试类-线程创建以及线程控制器 内含创建线程、synchronized、ReentrantLock、ReadWriteLock、CAS、四种引用、并发控制器、volatile

    23 按需上锁—ReadWriteLock详解.pdf

    Java并发编程学习宝典(漫画版),Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习宝典(漫画版)Java并发编程学习...

    java并发编程-AQS和JUC实战

    之所以称之为重⼊锁,就是⼀个线程允许反复进⼊。当然,这⾥的反复仅仅局限于⼀个线程;如 果同⼀个线程多次获锁,那么在释放锁的时候,也必须释放相同次数。如果释放锁的次数多,那么 会得到⼀个java.lang....

Global site tag (gtag.js) - Google Analytics