线程中的读写锁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 多线程程序写日 ...
随机推荐
- c#中委托与事件
参考:http://www.tracefact.net/tech/009.html 张子阳:http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/9 ...
- Mybatis-Plus 实战完整学习笔记(五)------insert测试
一.更新操作探究(3.0.3版本) demo /** * 修改用户 * @throws SQLException */ @Test public void update() throws SQLExc ...
- html的那些小小细节
1.get post方式提交的不同 get:数据放在url的后面,用?连接 会在客户端保留缓存信息,不安全 ...
- asp.net上传文件夹
最近公司做工程项目,实现文件夹上传. 网上找了一天,发现网上很多代码都存在相似问题,最后终于找到了一个符合要求的项目. 工程如下: 这里对项目的文件夹上传进行分析,实现文件夹上传,如何进行文件夹上传. ...
- JS 对象(Object)和字符串(String)互转方法
利用原生JSON对象,将对象转为字符串 1 2 3 4 5 6 var jsObj = {}; jsObj.testArray = [1,2,3,4,5]; jsObj.name = 'CSS3'; ...
- hdu 4937 base进制只含3456的base数
http://acm.hdu.edu.cn/showproblem.php?pid=4937 给定一个数n,若这个数在base进制下全由3,4,5,6组成的话,则称base为n的幸运进制,给定n,求有 ...
- kafka eagel的使用
sql语句eq: select * from "ke_test_topic" where "partition" in (0,1,2) limit 100 官网 ...
- [php-cookie] cookie 请求跨域,如何共享
cookie 请求跨域的问题, 假设我有两个域名,一个 m.example.com,另一个是 www.example.com . 那么我需要如何设置 cookie 才可以在这两个域名都实现共享呢? / ...
- ORACLE中的FTP例子代码
http://blog.csdn.net/mashengwang/article/details/5982663 CREATE OR REPLACE DIRECTORY my_docs AS '/u0 ...
- Android-okhttp
在AndroidManifest.xml配置网络访问权限: <!-- 访问网络是危险的行为 所以需要权限 --> <uses-permission android:name=&quo ...