java多线程-ReadWriteLock
大纲:
- ReadWriteLock接口
- ReentrantReadWriteLock
- ReentrantReadWriteLock使用
一、ReadWriteLock
public interface ReadWriteLock {
Lock readLock();
Lock writeLock();
}
- readLock获得读锁。
- writeLock获得写锁。
二、ReentrantReadWriteLock是ReadWriteLock的实现类
- ReentrantReadWriteLock内部维护了两个实现Lock接口的内部类ReadLock读锁,与WriteLock写锁。
- 仅写锁支持condition。
- 锁降级:写锁降级为读锁,获取写锁、获取读锁、释放写锁。
- 锁升级:不支持读锁升级为写锁。
- 线程间互斥关系:读读共享锁、读写独享锁、写写独享锁
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的更多相关文章
- Java 多线程 ReadWriteLock
ReadWriteLock是JDK 1.5提供的读写分离锁,可以减少锁竞争.例如,线程A1.A2和A3进行写操作,线程B1.B2和B3进行读操作,如果使用重入锁或者内部锁,那么理论上所有读之间.读与写 ...
- java多线程 -- ReadWriteLock 读写锁
写一条线程,读多条线程能够提升效率. 写写/读写 需要“互斥”;读读 不需要互斥. ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作.只要没有 writer,读取锁 ...
- 40个Java多线程问题总结
前言 Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多.越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的.这篇文章主要是对多线程的问题进行 ...
- Java多线程系列--“JUC锁”03之 公平锁(一)
概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...
- Java多线程系列--“JUC锁”04之 公平锁(二)
概要 前面一章,我们学习了“公平锁”获取锁的详细流程:这里,我们再来看看“公平锁”释放锁的过程.内容包括:参考代码释放公平锁(基于JDK1.7.0_40) “公平锁”的获取过程请参考“Java多线程系 ...
- Java多线程系列--“JUC锁”01之 框架
本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--“JUC锁”01之 框架02. Java多线程系列--“JUC锁”02之 互斥锁Reentrant ...
- java多线程系类:JUC锁:01之框架
本章,我们介绍锁的架构:后面的章节将会对它们逐个进行分析介绍.目录如下:01. Java多线程系列--"JUC锁"01之 框架02. Java多线程系列--"JUC锁&q ...
- java多线程编程
一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复 ...
- Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例
概要 前面对"独占锁"和"共享锁"有了个大致的了解:本章,我们对CountDownLatch进行学习.和ReadWriteLock.ReadLock一样,Cou ...
随机推荐
- springMVC框架集成tiles模板
将tiles模板集成到springMVC框架下,大概流程如下: 1.在配置文件中加入tiles支持 我的servlet配置文件名为spring-mvc.xml.具体配置如下: <?xml ver ...
- javascript总结40:DOM中操作样式的两种方式
1 DOM中操作样式的两种方式 1 通过元素的style属性 注意: 通过style属性设置样式时,css中要写单位的属性,在js代码中也要加单位 //html <div id="bo ...
- 两个SSH2间免密码登录
SSH2免密码登录OpenSSHhttp://blog.csdn.net/aquester/article/details/23836299 OpenSSH免密码登录SSH2http://blog.c ...
- uname查看系统名称
功能说明:uname用来获取电脑和操作系统的相关信息. 语 法:uname [-amnrsvpio][--help][--version] 补充说明:uname可显示linux主机所用的操作系统的版本 ...
- Animator 设置动画效果
1. 调节预设对象大小适中 2. 设置骨骼,修改关节 3. 拖入预设动作效果对象中 4. 将预设对象拉入场景中,并新建AnimatorController 5. 新建动作或BlendTree,设置参数 ...
- c#获取pdf文件页数
引用命名空间:using iTextSharp.text.pdf; string filePath = Server.MapPath("/upload/123.pdf"); //文 ...
- Split 之特殊用法
java中split()特殊符号"." "|" "*" "\" "]" 关于点的问题是用stri ...
- CancellationTokenSource 取消任务
using System; using System.Threading; using System.Threading.Tasks; namespace ConsoleApp1 { class Pr ...
- 一文读懂加固apk的开发者是怎么想的
有人说加固会明显拖慢启动速度,同时造成运行卡顿,严重降低用户体验,而且加固是完全可以脱壳的,只需要pc配合进行断点调试就能抓到解密后的dex文件,加固并没有所说的那么安全. 但是为什么还有一大批开发者 ...
- Linux--多用户登录服务器端口抓包
以root身份登录1.新建用户组用命令groupadd test2.添加用户useradd -d /home/test/bei_1 -s /bin/sh -g test -m bei_1此命令新建了一 ...