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

package org.github.lujiango;

import java.util.concurrent.locks.ReentrantReadWriteLock;

public class Test09 {

    static class Service {
private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); public void read() {
try {
lock.readLock().lock();
System.out.println("get read lock: " + Thread.currentThread().getName());
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.readLock().unlock();
}
} public void write() {
try {
lock.writeLock().lock();
System.out.println("get write lock: " + Thread.currentThread().getName());
Thread.sleep(10000);
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.writeLock().unlock();
}
}
} static class ThreadReader extends Thread {
private Service service; public ThreadReader(Service service) {
this.service = service;
} @Override
public void run() {
service.read();
}
} static class ThreadWriter extends Thread {
private Service service; public ThreadWriter(Service service) {
this.service = service;
} @Override
public void run() {
service.write();
}
} public static void main(String[] args) {
Service service = new Service();
// (1) 读读
ThreadReader r1 = new ThreadReader(service);
ThreadReader r2 = new ThreadReader(service);
r1.start();
r2.start();
// (2) 写写
ThreadWriter w1 = new ThreadWriter(service);
ThreadWriter w2 = new ThreadWriter(service);
w1.start();
w2.start();
} }

总结:读写,写读,写写都是互斥的;而读读是异步的,非互斥的。

多线程-ReentrantReadWriteLock的更多相关文章

  1. Java多线程——ReentrantReadWriteLock源码阅读

    之前讲了<AQS源码阅读>和<ReentrantLock源码阅读>,本次将延续阅读下ReentrantReadWriteLock,建议没看过之前两篇文章的,先大概了解下,有些内 ...

  2. java多线程----ReentrantReadWriteLock

    package com.test; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks ...

  3. Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock

    概要 Java的JUC(java.util.concurrent)包中的锁包括"独占锁"和"共享锁".在“Java多线程系列--“JUC锁”02之 互斥锁Ree ...

  4. Java多线程(五) Lock接口,ReentranctLock,ReentrantReadWriteLock

    在JDK5里面,提供了一个Lock接口.该接口通过底层框架的形式为设计更面向对象.可更加细粒度控制线程代码.更灵活控制线程通信提供了基础.实现Lock接口且使用得比较多的是可重入锁(Reentrant ...

  5. java多线程 21 : ReentrantReadWriteLock ,synchronized和ReentrantLock的对比

    读写锁ReentrantReadWriteLock概述 大型网站中很重要的一块内容就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务 ...

  6. Java:多线程,线程同步,同步锁(Lock)的使用(ReentrantLock、ReentrantReadWriteLock)

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨Lock对象. synchronize ...

  7. Java多线程编程之读写锁【ReentrantReadWriteLock】

    有时候我们需要有这样的需求:        对于同一个文件进行读和写操作,普通的锁是互斥的,这样读的时候会加锁,只能单线程的读,我们希望多线程的进行读操作,并且读的时候不能进行写操作,写的时候不能进行 ...

  8. 多线程之美7一ReentrantReadWriteLock源码分析

    目录 前言 在多线程环境下,为了保证线程安全, 我们通常会对共享资源加锁操作,我们常用Synchronized关键字或者ReentrantLock 来实现,这两者加锁方式都是排他锁,即同一时刻最多允许 ...

  9. java多线程7:ReentrantReadWriteLock

    真实的多线程业务开发中,最常用到的逻辑就是数据的读写,ReentrantLock虽然具有完全互斥排他的效果(即同一时间只有一个线程正在执行lock后面的任务), 这样做虽然保证了实例变量的线程安全性, ...

随机推荐

  1. .Net 2014 Connect() 相关文章合集

    微软在11月中旬的Connect()研讨会中公布了一系列 2015年的发展规划,今天在MSDN Blog上看到了一篇比较全的相关文章合集,这里转录一下,感兴趣的朋友可以看看. Announcement ...

  2. IIS整合tomcat

    IIS6.0+Tomcat7.0整合总结 (一)   为什么要把IIS.Tomcat整合到一起? 假如你遇到这种情况,你开发了一个javaweb项目要部署到服务器上,但是这个服务器上已经部署了asp. ...

  3. Android Parcel对象详解

    关于Parcel的使用 在分析Parcel之前,首先按照分析流程,介绍下关于Parcel的相关常规使用. 首先是关于Parcel的获取: Parcel parcle = Parcel.Obtain() ...

  4. centos7 将服务添加到systemctl

    centos7中提供了systemd服务,可以方便的管理各种服务 但是有些通过编译安装的服务systemd里面没有,我们只需要添加一下服务文件即可 以下用nginx作为例子,展示如何添加服务到syst ...

  5. vi 新建编辑文件时报错 E212 can’t open file for writing

    在vi修改防火墙配置时,不能够保存,报E212 can’t open file for writing错误. 网上大概给出了两种答案. 一是权限不够,可以用root权限事实,或者sudo 操作. 二是 ...

  6. About stats collected

    pg_class.relpages pg_class.reltuples仅仅是近似值,和实际数据会有点误差: 新建空表.首次insert对自己主动收集和更新统计信息,影响的表pg_class\pg_s ...

  7. DevExpress TreeList使用教程之绑定多级树

    DevExpress TreeList使用教程之绑定多级树   概述:TreeList控件可以同时显示树结构和其他数据列,即在一个列上建立父子关系展开或收缩,同时还可以显示其他列的内容.在TreeLi ...

  8. Java中内存泄露及垃圾回收机制

    转自:http://blog.sina.com.cn/s/blog_538b279a0100098d.html 写的相当不错滴...................... 摘  要 Java语言中,内 ...

  9. PHP基础知识(二)

    Global namespace  //看不懂看下面的中文 中英结合看看 When using namespaces, you may find that internal functions(内部( ...

  10. Spring IOC、对象依赖关系

    Spring IOC.对象依赖关系   2016-09-21 01:36 414人阅读 评论(0) 收藏 举报 本文章已收录于: 版权声明:本文为博主原创文章,未经博主允许不得转载. 引入 Strut ...