读锁(共享锁)写锁(独占锁)解析
读锁(共享锁)写锁(独占锁)解析
在多线程环境下一个资源类被读是没有任何问题的,所以满足并发要求,但是,如果有一个线程去写共享资源,那么就不应该再有其他线程可以对该资源进行读或写了。也就是说,读-读可以共存,读-写不能共存,写-写不能共存。
举例说明:
首先我们手写一个缓存类,不加锁看执行结果
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();}}
}
运行结果满足要求,只有先全部写完,才能进行读取
读锁(共享锁)写锁(独占锁)解析相关推荐
- MySQL - 全局锁、表级锁、行级锁、元数据锁、自增锁、意向锁、共享锁、独占锁、记录锁、间隙锁、临键锁、死锁
# 前言 本篇只介绍 MySQL 锁的基本知识. 我的 MySQL 版本是 MySQL 5.7.34, 建议使用 MySQL 5.6 及之后的版本. ## 先上一个图 ## 为什么要使用锁? 个人理解 ...
- MySQL的共享锁和独占锁
当有人在更新数据时,其他事务可以读取这行数据吗?需要加锁吗? 多个事务同时更新一行数据,都会加锁,然后排队等待,必须一个事务执行完毕提交了,释放锁,才能唤醒下一个事务继续执行.那这多个事务运行时,加的 ...
- 【MySQL】 ---- 共享锁、独占锁、行锁、表锁
锁 1.一致性读(Consitent Reads) 2.锁定读(Locking Reads) 2.1 共享锁 2.2 独占锁 2.2 锁定读语句 3.行锁 3.1 行锁 3.1.1 Record Lo ...
- 共享锁和独占锁简单介绍
共享锁和独占锁 独占锁:独占锁也叫排他锁,是指该锁一次只能被一个线程所持有.如果线程对数据A加上排他锁后,则其他线程不能再对A加任何类型的锁.获得排它锁的线程即能读数据又能修改数据. 共享锁:共享锁是 ...
- 【线程、锁】什么是AQS(锁分类:自旋锁、共享锁、独占锁、读写锁)
文章目录 1. 什么是AQS 1.1 锁分类 1.2 具体实现 2. AQS底层使用了模板方法模式 3. AQS的简单应用 参考 1. 什么是AQS AQS:全称为AbstractQuenedSync ...
- Java中的锁机制 -- 乐观锁、悲观锁、自旋锁、可重入锁、读写锁、公平锁、非公平锁、共享锁、独占锁、重量级锁、轻量级锁、偏向锁、分段锁、互斥锁、同步锁、死锁、锁粗化、锁消除
文章目录 1. Java中的锁机制 1.1 乐观锁 1.2 悲观锁 1.3 自旋锁 1.4 可重入锁(递归锁) 1.5 读写锁 1.6 公平锁 1.7 非公平锁 1.8 共享锁 1.9 独占锁 1.1 ...
- java 共享锁 独占锁_java中的公平锁、非公平锁、可重入锁、递归锁、自旋锁、独占锁和共享锁...
一.公平锁与非公平锁 1.1 概述 公平锁:是指多个线程按照申请锁的顺序来获取锁. 非公平锁:是指在多线程获取锁的顺序并不是按照申请锁的顺序,有可能后申请的线程比先申请的线程优先获取到锁,在高并发的情 ...
- 理解悲观锁乐观锁、同步锁、读锁、写锁
ava 锁分类 Java 中的锁有很多,可以按照不同的功能.种类进行分类,下面是我对 Java 中一些常用锁的分类,包括一些基本的概述 从线程是否需要对资源加锁可以分为 悲观锁 和 乐观锁 从资源已被 ...
- 独占锁(写锁)/共享锁(读锁)/互斥锁
理论 独占锁:指该锁一次只能被一个线程所持有.对于ReentrantLock和Synchronized而言都是独占锁. 共享锁:该锁可以被多个线程所持有.对于ReentrantReadWriteLoc ...
最新文章
- c语言编程输出所有水仙花数,c语言中,如何输出所有的水仙花数
- LDAP启动cacao提示Invalid file permission
- Android 5.0 API 的变化——开发人员注意
- linux进程泄露命令明文参数,sshpass 使Linux可以明文参数输入SSH密码(示例代码)
- 华三 h3c ospf、rip 路由引入和路由策略
- java实例成员与类成员区别_Java之实例成员与类成员
- Rust : 泛型与trait限定
- NFC Reader Tool 蓝牙NFC读写器使用教学
- 最短路径(状压dp)(ybtoj)
- ISILON OneFS CLI界面网络配置
- 互联网医疗泡沫破灭,一场从线上回归线下的技术圈地运动?
- 鼠标没有唤醒计算机功能,怎么设置碰到鼠标电脑不会唤醒亮起来
- C语言程序设计博客作业07
- 千万别小瞧九宫格 一道题就能让候选人原形毕露!
- 重置form表单中的input值
- 梯度下降算法原理 神经网络(Gradient Descent)
- python批量修改文件名称及文件属性
- 【9008】香甜的黄油
- 实习日记——Day2
- 2019年,转行到互联网行业,还有必要么?