读锁(共享锁)写锁(独占锁)解析
在多线程环境下一个资源类被读是没有任何问题的,所以满足并发要求,但是,如果有一个线程去写共享资源,那么就不应该再有其他线程可以对该资源进行读或写了。也就是说,读-读可以共存,读-写不能共存,写-写不能共存。
举例说明:
首先我们手写一个缓存类,不加锁看执行结果

package com.example.demo;import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.TimeUnit;class MyCache{private volatile Map<String,Object> map=new HashMap<>();public void put(String key,Object value){System.out.println(Thread.currentThread().getName()+"\t正在写入:"+value);//模拟网络通信延迟try {TimeUnit.MILLISECONDS.sleep(500);}catch (Exception e){e.printStackTrace();}map.put(key,value);System.out.println(Thread.currentThread().getName()+"\t正在写成:");}public void get(String key){System.out.println(Thread.currentThread().getName()+"\t正在读取:");//模拟网络通信延迟try {TimeUnit.MILLISECONDS.sleep(500);}catch (Exception e){e.printStackTrace();}Object result=map.get(key);System.out.println(Thread.currentThread().getName()+"\t读取完成:"+result);}
}
/*** Created by Administrator on 2020/7/5.*  读写锁讲解*  1.读锁(共享锁)*  2.写锁(独占锁)* @author qtx*/
public class ReadAndWriteLockDemo {public static void main(String[] args) {MyCache myCache=new MyCache();//5个线程写for (int i = 0; i < 5; i++) {final int temp=i;new Thread(() -> {myCache.put(temp+"",temp+"");}).start();}//5个线程读for (int i = 0; i < 5; i++) {final int temp=i;new Thread(() -> {myCache.get(temp+"");}).start();}}
}


可以看出,写没有完成,就被读取操作进行加塞
加塞读写锁之后效果

package com.example.demo;import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantReadWriteLock;class MyCache {private volatile Map<String, Object> map = new HashMap<>();private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();public void put(String key, Object value) {//加入读锁rwLock.writeLock().lock();try {System.out.println(Thread.currentThread().getName() + "\t正在写入:" + value);//模拟网络通信延迟try {TimeUnit.MILLISECONDS.sleep(500);} catch (Exception e) {e.printStackTrace();}map.put(key, value);System.out.println(Thread.currentThread().getName() + "\t写入完成:");} catch (Exception e) {e.printStackTrace();} finally {rwLock.writeLock().unlock();}}public void get(String key) {//加入写锁rwLock.readLock().lock();try {System.out.println(Thread.currentThread().getName() + "\t正在读取:");//模拟网络通信延迟try {TimeUnit.MILLISECONDS.sleep(500);} catch (Exception e) {e.printStackTrace();}Object result = map.get(key);System.out.println(Thread.currentThread().getName() + "\t读取完成:" + result);} catch (Exception e) {e.printStackTrace();} finally {rwLock.readLock().unlock();}}
}/*** Created by Administrator on 2020/7/5.* 读写锁讲解* 1.读锁(共享锁)* 2.写锁(独占锁)** @author qtx*/
public class ReadAndWriteLockDemo {public static void main(String[] args) {MyCache myCache = new MyCache();//5个线程写for (int i = 0; i < 5; i++) {final int temp = i;new Thread(() -> {myCache.put(temp + "", temp + "");}).start();}//5个线程读for (int i = 0; i < 5; i++) {final int temp = i;new Thread(() -> {myCache.get(temp + "");}).start();}}
}


运行结果满足要求,只有先全部写完,才能进行读取

读锁(共享锁)写锁(独占锁)解析相关推荐

  1. MySQL - 全局锁、表级锁、行级锁、元数据锁、自增锁、意向锁、共享锁、独占锁、记录锁、间隙锁、临键锁、死锁

    # 前言 本篇只介绍 MySQL 锁的基本知识. 我的 MySQL 版本是 MySQL 5.7.34, 建议使用 MySQL 5.6 及之后的版本. ## 先上一个图 ## 为什么要使用锁? 个人理解 ...

  2. MySQL的共享锁和独占锁

    当有人在更新数据时,其他事务可以读取这行数据吗?需要加锁吗? 多个事务同时更新一行数据,都会加锁,然后排队等待,必须一个事务执行完毕提交了,释放锁,才能唤醒下一个事务继续执行.那这多个事务运行时,加的 ...

  3. 【MySQL】 ---- 共享锁、独占锁、行锁、表锁

    锁 1.一致性读(Consitent Reads) 2.锁定读(Locking Reads) 2.1 共享锁 2.2 独占锁 2.2 锁定读语句 3.行锁 3.1 行锁 3.1.1 Record Lo ...

  4. 共享锁和独占锁简单介绍

    共享锁和独占锁 独占锁:独占锁也叫排他锁,是指该锁一次只能被一个线程所持有.如果线程对数据A加上排他锁后,则其他线程不能再对A加任何类型的锁.获得排它锁的线程即能读数据又能修改数据. 共享锁:共享锁是 ...

  5. 【线程、锁】什么是AQS(锁分类:自旋锁、共享锁、独占锁、读写锁)

    文章目录 1. 什么是AQS 1.1 锁分类 1.2 具体实现 2. AQS底层使用了模板方法模式 3. AQS的简单应用 参考 1. 什么是AQS AQS:全称为AbstractQuenedSync ...

  6. Java中的锁机制 -- 乐观锁、悲观锁、自旋锁、可重入锁、读写锁、公平锁、非公平锁、共享锁、独占锁、重量级锁、轻量级锁、偏向锁、分段锁、互斥锁、同步锁、死锁、锁粗化、锁消除

    文章目录 1. Java中的锁机制 1.1 乐观锁 1.2 悲观锁 1.3 自旋锁 1.4 可重入锁(递归锁) 1.5 读写锁 1.6 公平锁 1.7 非公平锁 1.8 共享锁 1.9 独占锁 1.1 ...

  7. java 共享锁 独占锁_java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁...

    一.公平锁与非公平锁 1.1 概述 公平锁:是指多个线程按照申请锁的顺序来获取锁. 非公平锁:是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情 ...

  8. 理解悲观锁乐观锁、同步锁、读锁、写锁

    ava 锁分类 Java 中的锁有很多,可以按照不同的功能.种类进行分类,下面是我对 Java 中一些常用锁的分类,包括一些基本的概述 从线程是否需要对资源加锁可以分为 悲观锁 和 乐观锁 从资源已被 ...

  9. 独占锁(写锁)/共享锁(读锁)/互斥锁

    理论 独占锁:指该锁一次只能被一个线程所持有.对于ReentrantLock和Synchronized而言都是独占锁. 共享锁:该锁可以被多个线程所持有.对于ReentrantReadWriteLoc ...

最新文章

  1. c语言编程输出所有水仙花数,c语言中,如何输出所有的水仙花数
  2. LDAP启动cacao提示Invalid file permission
  3. Android 5.0 API 的变化——开发人员注意
  4. linux进程泄露命令明文参数,sshpass 使Linux可以明文参数输入SSH密码(示例代码)
  5. 华三 h3c ospf、rip 路由引入和路由策略
  6. java实例成员与类成员区别_Java之实例成员与类成员
  7. Rust : 泛型与trait限定
  8. NFC Reader Tool 蓝牙NFC读写器使用教学
  9. 最短路径(状压dp)(ybtoj)
  10. ISILON OneFS CLI界面网络配置
  11. 互联网医疗泡沫破灭,一场从线上回归线下的技术圈地运动?
  12. 鼠标没有唤醒计算机功能,怎么设置碰到鼠标电脑不会唤醒亮起来
  13. C语言程序设计博客作业07
  14. 千万别小瞧九宫格 一道题就能让候选人原形毕露!
  15. 重置form表单中的input值
  16. 梯度下降算法原理 神经网络(Gradient Descent)
  17. python批量修改文件名称及文件属性
  18. 【9008】香甜的黄油
  19. 实习日记——Day2
  20. 2019年,转行到互联网行业,还有必要么?

热门文章

  1. 微信小程序真机无法发送网络请求or网络错误解决方法
  2. 在基金重仓股中随机选股策略
  3. 爱尔眼科跌超11%,葛兰管理的中欧医疗健康混合基金产品重仓股
  4. java饥荒,我的世界1.7.10饥荒整合包
  5. jar文件打开方式和直接运行方法
  6. 2022-2028年中国红豆杉行业市场运营格局及发展趋向分析报告
  7. C/C++黑洞陷阱(Kaprekar问题)
  8. 南京工业大学python试卷_南京工业大学施工技术期末试卷及答案
  9. SOFABoot源码解析之模块化开发
  10. 就想和你上#床能咋地?【ZT】送给没GF的兄弟们