Java多线程之多种锁和阻塞队列
作者:若能绽放光丶 发布时间:2023-09-26 10:31:55
标签:java,锁,阻塞队列
一、悲观锁和乐观锁
1.1. 乐观锁
顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。
乐观锁适用于多读的应用类型,乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现的。
CAS全称 Compare And Swap(比较与交换),是一种无锁算法。在不使用锁(没有线程被阻塞)的情况下实现多线程之间的变量同步。java.util.concurrent包中的原子类就是通过CAS来实现了乐观锁。
1.2. 悲观锁
总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。
二、公平锁和非公平锁
三、可重入锁(递归锁)
先看官网的解释翻译后的
看不太懂,那么我们结合一下下面的案例就行了。
两个同步方法01和02,都是被锁住的,当我们运行01的时候,一旦获取的01的锁,那么02的锁也可以被自动获取。
补充:lock和unlock只要配对使用,就不会有问题。
四、自旋锁
其实CAS底层就是用 Unsafe类+CAS(自旋) 实现的,CAS底层有一个do while语句,循环比较在主存中的值是否等于期望值。
五、独占锁(写)/共享锁(读)
读归读,写归写,读和写可以同时进行。
六、什么是阻塞队列?
队列中放着数据,一个线程生产,一个线程获取。
七、阻塞队列(BlockingQueue)
阻塞队列有多少实现类呢?
来源:https://blog.csdn.net/weixin_51194902/article/details/117571506
0
投稿
猜你喜欢
- Spring框架七大模块简单介绍Spring中MVC模块代码详解Spring的WEB模块用于整合Web框架,例如Struts1、Struts
- 在sql server2005以及之后的sql server中引入了Xml数据类型,在C#中使用Xml数据类型需要指定参数类型为SqlDbT
- 自动注入和@Autowire@Autowire不属于自动注入!注入方式(重要)在Spring官网上(文档),定义了在Spring中的注入方式
- 需求:字符串(字符串只有一位小数)转float进行运算, 将结果转成字符串(保留一位小数)直接上代码:float f1 = 0.1f;Str
- 【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都
- 概述基于java + swing + JFrame 的图书馆管理系统,租车,还车,管理员管理用户,付款等。部分代码public class
- 1、将 Jmeter 下 extras 目录中 ant-jmeter-1.1.1.jar 包拷贝至 ant 安装目录下的lib目录中,否则会
- 如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作。同时,这个问题在Stack Overflow
- java 读取网页内容的实例详解import java.io.BufferedReader; import java.io.IOExcept
- 打开ITerm终端进入命令输入,sudo su,输入密码创建.bash_profile文件touch .bash_profile打开.bas
- SpringBoot读取外置logback配置文件springboot项目可以读取外置配置文件,避免了修改配置文件需要重新打包部署的问题。部
- 一、封装一个工具类1、简易版package net.aexit.construct.acceptance.websky.utils;impo
- 一、Spring启动时实现初始化的几种方式准确的说是spring容器实例化完成后,几种初始化的方式。为什么这么说呢?下看面示例:@Slf4j
- 前言Mybatis真正强大的地方在于SQL映射语句,这也是它的魅力所在。相对于它强大的功能,SQL映射文件的配置却非常简单,我上篇文章语句讲
- 本文实例讲述了C#实现简单合并word文档的方法。分享给大家供大家参考。具体如下:using System;using System.Col
- Warning:这是《Java 程序员进阶之路》专栏的第 55 篇。回来后小二找到了我,于是我就写下了这篇文章丢给他,并严厉地告诉他:再搞不
- 在使用SpringBoot做接口访问如何做接口的限流,这里我们可以使用google的Guava包来实现,当然我们也可以自己实现限流,Guav
- 一、顺序结构程序的执行和代码的执行顺序有关,如果调整代码的书写顺序, 则执行顺序也发生变化二、分支结构基本语法形式1:if(布尔表达式){
- Java 开发语言中实现HTTP请求的方法主要有两种:一种是JAVA的标准类HttpUrlConnection,比较原生的实现方法;另一种是
- JMMJMM是指Java内存模型,不是Java内存布局,不是所谓的栈、堆、方法区。每个Java线程都有自己的工作内存。操作数据,首先从主内存