读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时读,但不能同时写,那就上读锁;如果你的代码修改数据,只能有一个人在写,且不能同时读取,那就上写锁。总之,读的时候上读锁,写的时候上写锁!

三个线程读数据,三个线程写数据示例:
可以同时读,读的时候不能写,不能同时写,写的时候不能读。
读的时候上读锁,读完解锁;写的时候上写锁,写完解锁。
注意finally解锁。

package com.ljq.test.thread;import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;/*** 读写锁* * @author Administrator* */
public class ReadWriteLockTest {public static void main(String[] args) {final ReadWrite rw = new ReadWrite();for (int i = 0; i < 3; i++) {new Thread() {public void run() {while (true) {rw.read();}}}.start();new Thread() {public void run() {while (true) {rw.write(new Random().nextInt(10000));}}}.start();}}
}/*** 读和写要互斥,因此要把它们放在同一个类中* * @author Administrator**/
class ReadWrite {private Object data = null;//共享数据,只能有一个线程写该数据,但可以有多个线程同时读该数据。ReadWriteLock rwl = new ReentrantReadWriteLock();/*** 读数据*/public void read() {rwl.readLock().lock();try {System.out.println(Thread.currentThread().getName() + " be ready to read data!");Thread.sleep((long) (Math.random() * 1000));System.out.println(Thread.currentThread().getName() + "have read data :" + data);} catch (InterruptedException e) {e.printStackTrace();} finally {rwl.readLock().unlock();}}/*** 写数据* * @param data*/public void write(Object data) {rwl.writeLock().lock();try {System.out.println(Thread.currentThread().getName() + " be ready to write data!");Thread.sleep((long) (Math.random() * 1000));this.data = data;System.out.println(Thread.currentThread().getName() + " have write data: " + data);} catch (InterruptedException e) {e.printStackTrace();} finally {rwl.writeLock().unlock();}}
}

设计一个缓存系统
缓存系统:你要取数据,需调用我的public Object getData(String key)方法,我要检查我内部有没有这个数据,如果有就直接返回,如果没有,就从数据库中查找这个数,查到后将这个数据存入我内部的存储器中,下次再有人来要这个数据,我就直接返回这个数不用再到数据库中找了。你要取数据不要找数据库,来找我。

package com.ljq.test.thread;import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;/*** 设计一个缓存系统* * * @author Administrator**/
public class CacheDemo {private Map<String, Object> cache = new HashMap<String, Object>();public static void main(String[] args) {String key = "name";CacheDemo cacheDemo = new CacheDemo();System.out.println(cacheDemo.getData(key)); //从数据库获取数据System.out.println(cacheDemo.getData(key)); //从缓存获取数据System.out.println(cacheDemo.getData(key)); //从缓存获取数据}private ReadWriteLock rwl = new ReentrantReadWriteLock();public Object getData(String key) {rwl.readLock().lock(); //上读锁Object value = null;try {value = cache.get(key); //先查询内部存储器中有没有要的值if (value == null) { //如果没有,就去数据库中查询,并将查到的结果存入内部存储器中//释放读锁、上写锁rwl.readLock().unlock();rwl.writeLock().lock();try {if (value == null) { //再次进行判断,防止多个写线程堵在这个地方重复写System.out.println("read data from database");value = "张三";cache.put(key, value);}} finally {//设置完成 释放写锁rwl.writeLock().unlock();}//恢复读写状态rwl.readLock().lock();}else{System.out.println("read data from cache");}} finally {rwl.readLock().unlock(); //释放读锁}return value;}
}

返回结果:

转载于:https://www.cnblogs.com/linjiqin/p/4504601.html

java5 ReadWriteLock用法--读写锁实现相关推荐

  1. Linux应用开发 - 读写锁

    Linux应用开发 - 读写锁 什么时候用到读写锁:多线程开发中,如果少数线程会对共享内存数据修改,多数线程只是读取共享数据的值,就适用于读写锁解决"线程间抢夺资源"的问题. 只要 ...

  2. Java多线程学习十六:读写锁 ReadWriteLock 获取锁有哪些规则

    读写锁 ReadWriteLock 获取锁有哪些规则呢? 在没有读写锁之前,我们假设使用普通的 ReentrantLock,那么虽然我们保证了线程安全,但是也浪费了一定的资源,因为如果多个读操作同时进 ...

  3. 读写锁ReadWriteLock和缓存实例

    读写锁:多个读锁不互斥,读锁与写锁互斥,写锁与写锁互斥.即:读的时候不允许写,写的时候不允许读,可以同时读. synchronized关键字和普通的Lock构造的锁,会造成读与读之间的互斥,因此读写锁 ...

  4. 读写锁ReadWriteLock

    为了提高性能,Java提供了读写锁,在读的地方使用读锁,在写的地方使用写锁,灵活控制,如果没有写锁的情况下,读是无阻塞的,在一定程度上提高了程序的执行效率. Java中读写锁有个接口java.util ...

  5. JUC系列(八)| 读写锁-ReadWriteLock

    多线程一直Java开发中的难点,也是面试中的常客,趁着还有时间,打算巩固一下JUC方面知识,我想机会随处可见,但始终都是留给有准备的人的,希望我们都能加油!!! 沉下去,再浮上来,我想我们会变的不一样 ...

  6. java多线程 -- ReadWriteLock 读写锁

    写一条线程,读多条线程能够提升效率. 写写/读写 需要"互斥"; 读读 不需要互斥. ReadWriteLock 维护了一对相关的锁,一个用于只读操作,另一个用于写入操作.只要没有 ...

  7. 信号量semaphore 读写锁ReadWriteLock 倒计时器CountDownLatch 循环栅栏 CyclicBarrier 线程阻塞工具类LockSupport...

    信号量semaphore    允许多个线程同时访问 读写锁ReadWriteLock   在频繁的读写耗时中,读之间不阻塞 倒计时器CountDownLatch    obj = new Count ...

  8. Java之读写锁ReadWriteLock实现

    一.为什么需要读写锁? 与传统锁不同的是读写锁的规则是可以共享读,但只能一个写,总结起来为:读读不互斥,读写互斥,写写互斥,而一般的独占锁是:读读互斥,读写互斥,写写互斥,而场景中往往读远远大于写,读 ...

  9. Java并发编程-ReadWriteLock读写锁

    1.ReadWriteLock介绍 为什么我们有了Lock,还要用ReadWriteLock呢.我们对共享资源加锁之后,所有的线程都将会等待.Lock读操作也锁,写操作也会锁,而对共享资源读的时候,其 ...

最新文章

  1. 寄存器映射与直接操作寄存器
  2. vue分页+spring boot +分页插件pagehelper
  3. JavaScript 私有成员
  4. 使用myeclipse创建带注解的model实体类
  5. Dijkstra算法求最短路径(java)
  6. c语言node程序,如何从Node.js调用C代码?
  7. SAP Commerce Cloud 导入消费OCC API需要使用的credentials
  8. swift string转int_swift中结构体和类的区别(值类型和引用类型的区别)
  9. 计算机硬件操作系统应用软件之间的关系,操作系统是其他应用软件运行的基础,什么是操作系统...
  10. Atitit 性能提升总结 流水线模式 FutureTask ForkJoinTask 1.1. 流水线工作方式pipeline 1 1.2. FutureTask模式使用异步 流水线 还有多
  11. 用swift写的一款小游戏,模仿的僵尸危机
  12. PostgreSQL 的 window函数
  13. 大功率UWB模块 XZM3000 移植手册 《从DWM1000到XZM3000移植手册》
  14. iOS 截屏 长图 拼图
  15. 屏幕录像专家V7.5注册机
  16. Google Chrome浏览器翻译失败
  17. WIN7点击右下角 安全删除硬件并弹出媒体 无反应解决方法
  18. 通过UEFI禁用 BD PROCHOT
  19. Inside-OutsideNet
  20. Math三点共线判断

热门文章

  1. 全球首款光线追踪GPU
  2. OpenCV的resize方法与双线性插值
  3. 转——深度学习之BN算法(Batch Normailization)
  4. ajax顺序请求你,ajax请求之返回数据的顺序问题分析
  5. debian查询端口进程_centos linux系统配置查询
  6. python爬虫慕课网利用xpath_python爬虫实践——零基础快速入门(二)爬取豆瓣电影...
  7. 计算机电子琴音乐,电脑电子琴软件
  8. java确认rabbitmq_RabbitMQ的消息确认模式
  9. 使用php进行后台开发,PHP后台开发用到的基础方法整理【原创】
  10. Node.js-Express框架