大纲:

  1. ReadWriteLock接口
  2. ReentrantReadWriteLock
  3. ReentrantReadWriteLock使用

一、ReadWriteLock

public interface ReadWriteLock {
Lock readLock();
Lock writeLock();
}
  1. readLock获得读锁。
  2. writeLock获得写锁。

二、ReentrantReadWriteLock是ReadWriteLock的实现类

  1. ReentrantReadWriteLock内部维护了两个实现Lock接口的内部类ReadLock读锁,与WriteLock写锁。
  2. 仅写锁支持condition。
  3. 锁降级:写锁降级为读锁,获取写锁、获取读锁、释放写锁。
  4. 锁升级:不支持读锁升级为写锁。
  5. 线程间互斥关系:读读共享锁、读写独享锁、写写独享锁
    public class Met {
    ReadWriteLock lock = new ReentrantReadWriteLock();
    public void read(Thread thread){
    try {
    lock.readLock().lock();
    System.out.println(thread.getName()+"read lock");
    for(int i =0;i<10;i++){
    System.out.println(thread.getName()+":"+i);
    }
    } finally {
    System.out.println(Thread.currentThread().getName()+"read unlock");
    lock.readLock().unlock();
    }
    } public void write(Thread thread){
    try {
    lock.writeLock().lock();
    System.out.println(thread.getName()+"write lock");
    for(int i =0;i<10;i++){
    System.out.println(thread.getName()+":"+i);
    }
    } finally {
    System.out.println(Thread.currentThread().getName()+"write unlock");
    lock.writeLock().unlock();
    }
    }
    }
    public class ReadRunnable implements Runnable {
    Met met;
    ReadRunnable(Met met){
    this.met = met;
    }
    @Override
    public void run() {
    met.read(Thread.currentThread());
    }
    }
    public class WriteRunnable implements Runnable {
    Met met;
    WriteRunnable(Met met){
    this.met = met;
    }
    @Override
    public void run() {
    met.write(Thread.currentThread());
    }
    }
    class TestReadWrite {
    public static void main(String[] args) {
    Met met = new Met();
    ReadRunnable read = new ReadRunnable(met);
    WriteRunnable write = new WriteRunnable(met);
    Thread threadread0 = new Thread(read);
    Thread threadread1 = new Thread(read);
    Thread threadwrite0 = new Thread(write);
    threadread0.start();
    threadread1.start();
    threadwrite0.start();
    }
    }

三、ReentrantReadWriteLock使用

  官方demo:更新缓存后的锁降级,保持读锁。

public class CachedData {
ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
String data = "未更新"; //缓存数据
volatile boolean isValid; //缓存数据是否有效
void processCachedData(){
readWriteLock.readLock().lock();
System.out.println(Thread.currentThread().getName()+"readLock.lock");
//校验缓存数据是否有效,若无效跟新data,有效直接使用
if(!isValid){
System.out.println(Thread.currentThread().getName()+"readLock.unlock");
readWriteLock.readLock().unlock();
readWriteLock.writeLock().lock();
System.out.println(Thread.currentThread().getName()+"writeLock.lock");
//再次校验
if(!isValid){
data = "已更新";
isValid = true;
System.out.println(Thread.currentThread().getName()+">>>refresh data");
}
//写锁降级为读锁:释放写锁前获取读锁
readWriteLock.readLock().lock();
System.out.println(Thread.currentThread().getName()+"readLock.lock");
System.out.println(Thread.currentThread().getName()+"writeLock.unlock");
//写锁被释放,读锁依旧
readWriteLock.writeLock().unlock();
}
System.out.println(Thread.currentThread().getName()+">>>use data "+data);
System.out.println(Thread.currentThread().getName()+"readLock.unlock");
readWriteLock.readLock().unlock();
}
}
public class ReadWriteRunnable implements Runnable {
CachedData task;
public ReadWriteRunnable(CachedData task){
this.task = task;
}
@Override
public void run() {
task.processCachedData();
}
}
class TestReadWrite {
public static void main(String[] args) {
CachedData task = new CachedData();
ReadWriteRunnable readWriteRunnable = new ReadWriteRunnable(task);
new Thread(readWriteRunnable).start();
new Thread(readWriteRunnable).start();
new Thread(readWriteRunnable).start();
new Thread(readWriteRunnable).start();
new Thread(readWriteRunnable).start();
new Thread(readWriteRunnable).start();
}
}

java多线程-ReadWriteLock的更多相关文章

  1. Java 多线程 ReadWriteLock

    ReadWriteLock是JDK 1.5提供的读写分离锁,可以减少锁竞争.例如,线程A1.A2和A3进行写操作,线程B1.B2和B3进行读操作,如果使用重入锁或者内部锁,那么理论上所有读之间.读与写 ...

  2. java多线程 -- ReadWriteLock 读写锁

    写一条线程,读多条线程能够提升效率. 写写/读写 需要“互斥”;读读 不需要互斥. ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作.只要没有 writer,读取锁 ...

  3. 40个Java多线程问题总结

    前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...

  4. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  5. Java多线程系列--“JUC锁”04之 公平锁(二)

    概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...

  6. Java多线程系列--“JUC锁”01之 框架

    本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--“JUC锁”01之 框架02. Java多线程系列--“JUC锁”02之 互斥锁Reentrant ...

  7. java多线程系类:JUC锁:01之框架

    本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--"JUC锁"01之 框架02. Java多线程系列--"JUC锁&q ...

  8. java多线程编程

    一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复 ...

  9. Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例

    概要 前面对"独占锁"和"共享锁"有了个大致的了解:本章,我们对CountDownLatch进行学习.和ReadWriteLock.ReadLock一样,Cou ...

随机推荐

  1. Nginx下css的链接问题

    放在 Nginx 下的网页代码,在链接外部 css 文件时,可能出现没有链接成功的问题.需要在 nginx.conf 里的 http 下添加一行. http { include mime.types;

  2. C#实现动态页面静态化

    制作一个aspx页面,专门用来生成各个动态aspx页面的静态页面.如下图所示,仅将内容页和主页面生成静态页面,当然本例只是一个简单的范例,实际情况如很复杂,但原理都是相同的. 生成内容页: 本例中的不 ...

  3. rsync --exclude 参数

    /usr/bin/rsync -vr --exclude=".svn" --exclude="temp" --delete /alidata/www/pro/e ...

  4. 菜鸟-手把手教你把Acegi应用到实际项目中(1.2)

    7) daoAuthenticationProvider 进行简单的基于数据库的身份验证.DaoAuthenticationProvider获取数据库中的账号密码并进行匹配,若成功则在通过用户身份的同 ...

  5. java(2014)实现对mysql数据库分页的代码

    package util; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultS ...

  6. C#综合揭秘——细说多线程

    一.线程的定义  1. 1 进程.应用程序域与线程的关系 进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源.进程之间是相对独立的,一个进程无法访问另一个进程 ...

  7. 六星经典CSAPP-笔记(3)程序的机器级表示

    1.前言 IA32机器码以及汇编代码都与原始的C代码有很大不同,因为一些状态对于C程序员来说是隐藏的.例如包含下一条要执行代码的内存位置的程序指针(program counter or PC)以及8个 ...

  8. 文字分列 CSS属性

    column 这里有一系列新的CSS属性,可以帮助你很轻松的实现文字的多列布局.让我们瞧瞧: .three-column { padding: 1em; -moz-column-count: 3; - ...

  9. FireDAC 连接SQL Server一些要注意的地方(转)

    TFDConnection: FetchOptions.Mode 设置为fmAll, 返回全部结果, 否则默认只返回前50条, 效果与open以后再执行FetchAll一样 Specifies how ...

  10. 使用.Net Core 2.1开发Captcha图片验证码服务

    更新后续篇:Captcha服务(后续1) 使用.Net Core 2.1开发Captcha验证码服务 开发工具:Visual Studio 2017 15.7.3 开发平台:64位 Windows 1 ...