java常见的锁的类型

news/2024/11/24 3:11:09/

java常见的锁的类型

1.公平锁与非公平锁

公平锁:每个线程在获取锁时会先查看此锁维护的等待队列,如果为空或当前线程是等待队列的第一个,就占有锁,否则就加入到等待队列中,以后会FIFO的规则来从队列获取锁ReentrantLock的创建可以指定构造函数的boolean类型来指定得到公平锁或非公平锁,如果不写默认是false-非公平锁
ReentrantLock lock = new ReentrantLock(true);
非公平锁:上来就直接尝试获取锁,如果失败就采用公平锁的模式获取。。非公平锁吞吐量比较大 。
以下两个都是非公平锁
ReentrantLock lock = new ReentrantLock(false);
synchronized

2.可重入锁(递归锁)

指的是同一线程外层函数获得锁之后,内层递归函数仍然能获取该锁的代码,在同一个线程在外层方法获取锁的时候,在内层方法会自动获取锁
也就是:线程可以进入任何一个它已经拥有的锁所同步着的代码块
以下两个都是可重入锁
ReentrantLock
synchronized

3.独占锁(写锁)与共享锁(读锁):

独占锁(写锁) 一次只能被一个线程所持有,ReentrantLock、synchronized都是独占锁
共享锁(读锁) 该锁可以被多个线程所持有
读写锁的内部包含两把锁:一把是读(操作)锁,是一种共享锁;另一把是写(操作)锁,是一种独占锁 在没有写锁的时候,读锁可以被多个线程同时持有
写锁被一个线程持有,其他的线程不能再持有写锁,抢占写锁会阻塞,抢占读锁也会阻塞
读读相容
读写互斥
写写互斥

读写锁实例 ReentrantReadWriteLock

public class ReadWriteLock {public static void main(String[] args) {MyCache myCache = new MyCache();for (int i = 0; i < 5; i++) {final  int temp = i;new Thread(()->{myCache.put(temp+"",temp);},String.valueOf(i)).start();}for (int i = 0; i < 5; i++) {final  int temp = i;new Thread(()->{myCache.get(temp+"");},String.valueOf(i)).start();}}
}
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 正在写入:"+key);TimeUnit.MICROSECONDS.sleep(300);map.put(key,value);System.out.println(Thread.currentThread().getName()+"\t 写入完成:");}catch (Exception e){e.printStackTrace();}finally {rwLock.writeLock().unlock();}}public Object get(String key){rwLock.readLock().lock();System.out.println(Thread.currentThread().getName()+"\t 正在读取:"+key);try {TimeUnit.MICROSECONDS.sleep(300);Object o = map.get(key);System.out.println(Thread.currentThread().getName()+"\t 读取完成:"+o);return o;} catch (InterruptedException e) {e.printStackTrace();}finally {rwLock.readLock().unlock();}return null;}
}

输出:

1 正在写入:1
1 写入完成:
0 正在写入:0
0 写入完成:
2 正在写入:2
2 写入完成:
3 正在写入:3
3 写入完成:
4 正在写入:4
4 写入完成:
0 正在读取:0
1 正在读取:1
2 正在读取:2
3 正在读取:3
4 正在读取:4
0 读取完成:0
3 读取完成:3
2 读取完成:2
1 读取完成:1
4 读取完成:4

4.自璇锁

获取锁的线程不会阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文的切换的消耗,缺点是循环会消耗cpu

CAS底层的自旋锁

  public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {var5 = this.getIntVolatile(var1, var2);} while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));return var5;}

http://www.ppmy.cn/news/1278848.html

相关文章

TYPE C 接口知识详解

1、Type C 概述 Type-C口有4对TX/RX分线&#xff0c;2对USBD/D-&#xff0c;一对SBU&#xff0c;2个CC&#xff0c;另外还有4个VBUS和4个地线。 当Type-C接口仅用作传输DP信号时&#xff0c;则可利用4对TX/RX&#xff0c;从而实现4Lane传输&#xff0c;这种模式称为DPonly模式…

MyBatis增删改查基础及其xml文件

目录 一.增删改查基础 1.增 增Insert 获取自增ID 对insert参数进行重命名 2.删 3.改 4.查 1)对MySQL查询结果进行重命名 从MySQL层面--as 从mybatis层面--Results注解 复用Results的定义 2)配置自动转换驼峰命名&#xff08;推荐&#xff09; 二.Mybatis xml配置…

基于Spring自动注入快速实现策略模式+工厂模式优化过多的if..else

一、策略模式 1.1策略模式定义 在策略模式&#xff08;Strategy Pattern&#xff09;中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式定义了一系列算法或策略&#xff0c;并将每个算法封装在独立的类中&#xff0c;使得它们可以互相…

hive中array相关函数总结

目录 hive官方函数解释示例实战 hive官方函数解释 hive官网函数大全地址&#xff1a; hive官网函数大全地址 Return TypeNameDescriptionarrayarray(value1, value2, …)Creates an array with the given elements.booleanarray_contains(Array, value)Returns TRUE if the a…

【Amazon 实验①】使用 Amazon CloudFront加速Web内容分发

文章目录 实验架构图1. 准备实验环境2. 创建CloudFront分配、配置动、静态资源分发2.1 创建CloudFront分配&#xff0c;添加S3作为静态资源源站2.2 为CloudFront分配添加动态源站 在本实验——使用CloudFront进行全站加速中&#xff0c;将了解与学习Amazon CloudFront服务&…

STM32项目设计:智能门禁系统核心板版本 4种解锁方式

文章目录 一、项目简介二、原理图设计![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/809dd6c70b34425eb42f69187020c717.png)程序设计 哔哩哔哩视频链接&#xff1a; https://www.bilibili.com/video/BV1K64y1V7Y9?p4&spm_id_frompageDriver&vd_sourcee…

2023/12/21作业

思维导图 代码 .text .global _start _start: 灯1 gpio时钟使能 [4]->1 0x5000A28 LDR R0,0x50000A28 指定寄存器地址 LDR R1,[R0]将寄存器取出放到R1 ORR R1,R1,#(0x1<<4)将第四位设置为1 STR R1,[R0]读取R0寄存器到R1 PE…

ruoyi若依前后端分离版部署centos7服务器(全)

目录 VMware虚拟机 centos7 安装环境如下 一、msql 5.7 二、nginx1.23.3 三、java8 四、redis 3.2.1 五、部署若依前端 六、部署若依后端 前言 虚拟机的桥接与nat模式 : 重点 重点&#xff01;&#xff01;&#xff01; 无线不可以用桥接模式 &#xff0c;而你用了nat模式会…