大纲:

  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. springMVC框架集成tiles模板

    将tiles模板集成到springMVC框架下,大概流程如下: 1.在配置文件中加入tiles支持 我的servlet配置文件名为spring-mvc.xml.具体配置如下: <?xml ver ...

  2. javascript总结40:DOM中操作样式的两种方式

    1 DOM中操作样式的两种方式 1 通过元素的style属性 注意: 通过style属性设置样式时,css中要写单位的属性,在js代码中也要加单位 //html <div id="bo ...

  3. 两个SSH2间免密码登录

    SSH2免密码登录OpenSSHhttp://blog.csdn.net/aquester/article/details/23836299 OpenSSH免密码登录SSH2http://blog.c ...

  4. uname查看系统名称

    功能说明:uname用来获取电脑和操作系统的相关信息. 语 法:uname [-amnrsvpio][--help][--version] 补充说明:uname可显示linux主机所用的操作系统的版本 ...

  5. Animator 设置动画效果

    1. 调节预设对象大小适中 2. 设置骨骼,修改关节 3. 拖入预设动作效果对象中 4. 将预设对象拉入场景中,并新建AnimatorController 5. 新建动作或BlendTree,设置参数 ...

  6. c#获取pdf文件页数

    引用命名空间:using iTextSharp.text.pdf; string filePath = Server.MapPath("/upload/123.pdf"); //文 ...

  7. Split 之特殊用法

    java中split()特殊符号"." "|" "*" "\" "]"   关于点的问题是用stri ...

  8. CancellationTokenSource 取消任务

    using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp1 { class Pr ...

  9. 一文读懂加固apk的开发者是怎么想的

    有人说加固会明显拖慢启动速度,同时造成运行卡顿,严重降低用户体验,而且加固是完全可以脱壳的,只需要pc配合进行断点调试就能抓到解密后的dex文件,加固并没有所说的那么安全. 但是为什么还有一大批开发者 ...

  10. Linux--多用户登录服务器端口抓包

    以root身份登录1.新建用户组用命令groupadd test2.添加用户useradd -d /home/test/bei_1 -s /bin/sh -g test -m bei_1此命令新建了一 ...