线程中的读写锁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 多线程程序写日 ...
随机推荐
- java并发控制工具类和集合等
转载自:https://my.oschina.net/hosee/blog/607677 摘要: 本系列基于炼数成金课程,为了更好的学习,做了系列的记录. 本文主要介绍: 1.各种同步控制工具的使用 ...
- 20145232 《Java程序设计》课程总结
学期总结 实验报告链接汇总 实验一 Java开发环境的熟悉 实验二 Java面向对象程序设计 实验三 敏捷开发与XP实践 实验四 Andoid开发基础 实验五 Java网络编程 代码托管链接 :Jav ...
- Android多线程操作sqlite(Sqlite解决database locked问题)
参考http://blog.csdn.net/sdsxleon/article/details/18259973 很好 https://github.com/2point0/Android-Data ...
- VS2010与VS2013中的多字节编码与Unicode编码问题
1. 多字节字符与单字节字符 char与wchar_t 我们知道C++基本数据类型中表示字符的有两种:char.wchar_t. char叫多字节字符,一个char占一个字节,之所以叫多字节字符是因 ...
- form表单提交时action路劲问题
项目总出现window上部署可以访问,linux下部署不能访问的问题 linux下访问action必须是全路径,可以加上“${pageContext.request.contextPath}” 便可 ...
- openresty + lua 3、openresty http 调用
http 的话,openresty 已经集成,ng 的话,自己引入即可. github 地址:https://github.com/pintsized/lua-resty-http github 里提 ...
- CMUSphinx Learn - Before you start
Before you start 开始之前 Before you start the development of the speech application, you need to consid ...
- java 图片压缩 缩放
废话不多说,直接上代码,静态方法可直接调用,中间用流来处理的 /** * 图片缩放(未考虑多种图片格式和等比例缩放) * @param filePath 图片路径 * @param height 高度 ...
- Android记录10--android.os.NetworkOnMainThreadException异常解决办法
2013年11月1日小光棍节 有一段时间没有发表新的博客了,最近一直在忙着开发新浪微博客户端遇到很多问题比较头痛,比如说本篇博客要讲的NetworkOnMainThreadException这个异常, ...
- EBS中 EXCEL 格式报表输出的公用API
http://blog.itpub.net/10359218/viewspace-752601/ 最近的项目上写了一个公用的API,很久以前就用EXCEL发布过报表,但从没想过写API来简化... ...