线程中的读写锁ReadWriteLock
Lock锁还有两个非常强大的类
ReadWriteLock接口实现类ReentrantReadWriteLock(非常重要的锁)
想实现 读取的时候允许多线程并发访问,写入的时候不允许. 这种效果....这种非常好....提高安全性.

ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作。只要没有 writer,读取锁可以由多个 reader 线程同时保持。写入锁是独占的.
互联网或者电商都会用到缓存的一种技术.从数据库中查出来的信息,信息保存到一个集合中,下一次再查找的时候就不用再从数据库中查找了.
读写锁 ReadWriteLock 可以解决,如果多线程并发访问共享数据时,只做了读取操作,允许并发访问, 如果有写入的操作,不允许. 一般写入操作只会在第一次访问的时候写入.以后之后进行读取操作.
Cache0.java
import java.util.HashMap;
import java.util.Map; public class Cache0 { private static final Map<String,Object> CACHE = new HashMap<String,Object>(); public synchronized Object getValue(String key){
Object value = CACHE.get(key);
if(value == null){
value = "xxxx";//从数据库中查询出值,并赋值给value.
CACHE.put(key, value);
}
return value;
}
}
//如有有多条线程并发的访问这个方法,一开始value==null,多条线程都进入了if(value == null)然后给value赋值了很多次.
//所以我们需要给getValue方法增加同步synchronized 关键字public synchronized Object getValue(String key){...
//但是这样不太好,因为只有第一个线程进去的时候才需要同步,是set值,其他线程来不需要再同步,都是get值.
Cache.java
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
//缓存如果这么写,效率会有大大的提升.
public class Cache { private static final Map<String, Object> CACHE = new HashMap<String, Object>();
private static final ReadWriteLock RWL = new ReentrantReadWriteLock(); public Object getValue(String key) {
Object value = null;
try {
RWL.readLock().lock();// 读锁 锁上 value = CACHE.get(key);
if (value == null) {//第一次访问,缓存集合中没有值
try {
RWL.readLock().unlock();// 释放读锁
RWL.writeLock().lock();// 写锁锁上
if (value == null) {
value = "xxx";// 从数据库中查询出值,并赋值给value。
CACHE.put(key, value);
}
} finally {
RWL.writeLock().unlock();// 释放写锁
RWL.readLock().lock();// 读锁 锁上
}
}
} finally {
RWL.readLock().unlock();
}
return value;
}
}
线程中的读写锁ReadWriteLock的更多相关文章
- 读-写锁 ReadWriteLock & 线程八锁
读-写锁 ReadWriteLock: ①ReadWriteLock 维护了一对相关的锁,一个用于只读操作, 另一个用于写入操作. 只要没有 writer,读取锁可以由 多个 reader 线程同时保 ...
- 显式锁(三)读写锁ReadWriteLock
前言: 上一篇文章,已经很详细地介绍了 显式锁Lock 以及 其常用的实现方式- - ReetrantLock(重入锁),本文将介绍另一种显式锁 - - 读写锁ReadWriteLock. ...
- 22、Java并发性和多线程-Java中的读/写锁
以下内容转自http://ifeve.com/read-write-locks/: 相比Java中的锁(Locks in Java)里Lock实现,读写锁更复杂一些.假设你的程序中涉及到对一些共享资源 ...
- 【漫画】互斥锁ReentrantLock不好用?试试读写锁ReadWriteLock
ReentrantLock完美实现了互斥,完美解决了并发问题.但是却意外发现它对于读多写少的场景效率实在不行.此时ReentrantReadWriteLock来救场了!一种适用于读多写少场景的锁,可以 ...
- 【漫画】读写锁ReadWriteLock还是不够快?再试试StampedLock!
本文来源于公众号[胖滚猪学编程] 转载请注明出处! 在互斥锁ReentrantLock不好用?试试读写锁ReadWriteLock一文中,我们对比了互斥锁ReentrantLock和读写锁ReadWr ...
- Java 读写锁 ReadWriteLock 原理与应用场景详解
Java并发编程提供了读写锁,主要用于读多写少的场景,今天我就重点来讲解读写锁的底层实现原理@mikechen 什么是读写锁? 读写锁并不是JAVA所特有的读写锁(Readers-Writer Loc ...
- 线程高级篇-读写锁ReentrantReadWriteLock
转载原文:http://blog.csdn.net/john8169/article/details/53228016 读写锁: 分为读锁和写锁,多个读锁不互斥,读锁和写锁互斥,这是有JVM自己控制的 ...
- UNIX环境高级编程——线程同步之读写锁以及属性
读写锁和互斥量(互斥锁)很类似,是另一种线程同步机制,但不属于POSIX标准,可以用来同步同一进程中的各个线程.当然如果一个读写锁存放在多个进程共享的某个内存区中,那么还可以用来进行进程间的同步, 互 ...
- C# 多线程编程之锁的使用【互斥锁(lock)和读写锁(ReadWriteLock)】
多线程编程之锁的使用[互斥锁(lock)和读写锁(ReadWriteLock)] http://blog.csdn.net/sqqyq/article/details/18651335 多线程程序写日 ...
随机推荐
- 使用bat批处理文件定时自动备份sqlserver数据库
一.创建一个sql文件,在里面写入以下代码: USE MasterGOdeclare @str varchar(100)set @str='D:\sqlserver14backup\CDB\'+rep ...
- mysql学习之路_sql
查看数据库: Show databases; 查看指定部分数据库:模糊查询 Show databases like ‘patten’;--paatten是匹配模式 %:表示是匹配模式 _:表示匹配单个 ...
- java se的那些细节
局部变量:方法体内或语句块内,不能有修饰符 成员变量:与类的对象共存,可以有修饰符 类属性:与类共存,可以有修饰符 一.局部变量:必须先赋值,才能使用,如果不赋初值,则会报错,即没有默认的始使值,而基 ...
- 实现1sym转换成2个sym送给CVI(VGA数据)
CVI的时序如下 :de指示数据有效. 从下面的程序看,同步码的长度不会影响对有效数据的判断.同步码的作用更多的是用于计算行及一行的像素数目.方案一: 1 module vga_1sym_2_2sym ...
- WebLogic 11gR1修改jdk版本
WebLogic 11gR1默认是支持jdk1.6的 我们可以进入到E:\weblogic\user_projects\domains\base_domain\bin中的修改setDomainEnv. ...
- 15-BOM
BOM的介绍 JavaScript基础分为三个部分: ECMAScript:JavaScript的语法标准.包括变量.表达式.运算符.函数.if语句.for语句等. DOM:文档对象模型,操作网页上的 ...
- Redis-4.0.11集群配置
版本:redis-3.0.5 redis-3.2.0 redis-3.2.9 redis-4.0.11 参考:http://redis.io/topics/cluster-tutorial. 集群 ...
- C#系列之{流和序列化}
不论何种类型的文件都可以表示为一个字节数组.(Byte[]) 一.文件复制 (示例) 首先建立一个类似管道的东西将文件和内存中的程序连接,并将文件按字节发送.为了保存接收到的文件字节,需要创建一个字节 ...
- ID、句柄、指针、对象互相转换
/*************************************************************************************************** ...
- ArrayBlockingQueue和LinkedBlockingQueue
1.BlockingQueue接口定义了一种阻塞的FIFO queue ArrayBlockingQueue和LinkedBlockingQueue的区别: 1. 队列中锁的实现不同 ArrayBlo ...