多线程抽象知识汇总

文章目录

  • 本日鸡汤
  • 锁策略
    • 1. 乐观锁和悲观锁
    • 2. 轻量级锁和重量级锁
    • 3. 自旋锁和挂起等待锁
    • 4. 互斥锁和读写锁
    • 5. 公平锁和非公平锁
    • 6. 可重入锁和非重入锁.
    • 7. synchronized锁
  • CAS
    • 原子类
    • 自旋锁
    • ABA问题
  • synchronized 锁优化
    • 1. 锁升级/锁膨胀
    • 2. 锁消除
    • 3. 锁粗化
  • Java.util.Concurrle(JUC)
    • 1. Callable类
    • 2. ReentrantLock 类(reentrantlock锁和sunchronized锁的区别)
    • 3. Semaphore 信号量
    • 4. CountdownLatch
  • 编外

本日鸡汤

历经千帆, 归来仍是少年

锁策略

锁策略是针对多线程和并发编程来说的, 它主要是管理多个线程访问同一共享资源, 即发生锁竞争时该怎么办, 不同的锁策略会影响性能和并发程度, 以下介绍几种锁策略

1. 乐观锁和悲观锁

乐观锁和悲观锁并不是具体的锁, 而是两类锁, 是根据预测的锁竞争激烈程度的结果来定义乐观锁和悲观锁的
乐观锁和悲观锁属于两种不同的应对多个线程或事务对共享资源同时进行修改或者访问的方式

  1. 乐观锁: 预测多个线程或事务对共享资源同时进行修改或者访问的概率较小, 因此允许多个线程同时访问同一个共享资源, 但是在更新时会检查是否有其它线程对此资源进行过更改, 从而采取回滚或重新执行等策略
  2. 悲观锁: 预测多个线程或事务对共享资源同时进行修改或者访问的概率较大, 因此只允许一个线程对共享资源进行独立访问和修改.

2. 轻量级锁和重量级锁

轻量级锁和重量级锁是根据同步操作的时长和锁竞争程度
这里的同步指的是不同线程对共享资源的访问和控制

  1. 轻量级锁: 适用于短时间内的同步, 即短时间内允许多个线程同时操作共享资源. 当一个线程尝试获取轻量锁时, 如果没有竞争, 就会很轻易地获取到锁, 并且不需要阻塞其他线程, 但是如果存在竞争就会升级为重量级锁. 轻量级锁创建和销毁的开销较小. 轻量锁的设计是为了在并发情况下既可以提供足够的性能, 又能应对竞争的发生.
  2. 重量级锁: 适用于长时间的同步或高度竞争, 这里的长时间指的是在高度竞争中, 锁频繁升级为重量锁, 导致较多的线程被阻塞, 上下文切换次数增加, 而造成了性能的降低. 从而确保多个线程对共享资源的访问是有序且互斥的

3. 自旋锁和挂起等待锁

  1. 自旋锁: 线程在尝试获取锁失败时, 不会陷入阻塞, 而是循环检测锁的状态, 期望其他线程尽快释放锁. 这种锁策略(同步策略)适用于短时间的锁竞争(否则会大量消耗CPU资源), 和轻量级锁一样. 自旋锁省去了阻塞和上下文切换的开销
  2. 挂起等待锁: 线程在尝试获取锁失败时, 会立即陷入阻塞, 待锁被释放再尝试去获取锁, 适用于长时间的竞争. 是重量级锁的经典实现

4. 互斥锁和读写锁

  1. 互斥锁: 我们之前代码中出现的锁就都属于互斥锁, 互斥锁就是一个线程对锁对象加锁, 另一个线程如果也尝试对这个锁对象加锁就会陷入阻塞, 适用于互斥访问
  2. 读写锁: 读锁和读锁之间不存在锁竞争, 写锁和写锁, 读锁和写锁之间才存在锁竞争, 即允许多个线程同时拥有读锁, 但是如果有了写操作, 在写入时要独占锁, 此时其他的所有读写线程都会被阻塞, 这适用于读多写少的情况.

5. 公平锁和非公平锁

  1. 公平锁: 在锁被释放给另一个线程加锁时, 优先给陷入阻塞时间最长的线程加锁
  2. 非公平锁: 在锁被释放给另一个线程加锁时, 随机给等待锁的线程加锁.

操作系统和java原生锁都是非公平锁, 在实际开发中, 想要实现公平锁, 需要加入一个队列来实现先来后到的顺序, 这需要额外的空间成本

6. 可重入锁和非重入锁.

关于可重入性在死锁那个文章中介绍过https://editor.csdn.net/md/?articleId=133634215

  1. 可重入锁: 允许同一线程连续对同一锁对象进行加锁
  2. 不可重入锁: 不允许同一线程连续对同一锁对象进行加锁

7. synchronized锁

synchronized锁默认为乐观锁, 当线程竞争激烈时就成为悲观锁.
synchronized锁默认为轻量级锁(基于自旋锁实现), 当线程竞争激烈时就成为重量级锁(基于挂起等待锁实现)
synchronized锁是互斥锁
synchronized锁是非公平锁
synchronized锁是可重入锁

CAS

比较并修改, 将内存中的值和寄存器中的值相比较, 如果一致, 则用另一值来更新内存中的值, 这看似是两步操作, 但实际上CAS是一个原子操作. 既然是原子操作就可以用来代替上锁解决一些并发安全问题, 避免了传统上锁机制带来的性能问题.
应用CAS可以用来实现原子类自旋锁

原子类

原子类用CAS实现, 使用原子类可以实现线程安全.

原子类有以下几种

  1. AtomicInteger 对int型变量的原子操作
  2. AtomicLong 对long型变量的原子操作
  3. AtomicReference 对引用类型变量的原子操作
  4. AtomicBoolean 对boolean型变量的原子操作

下面以之前说过的两个线程对同一变量递增操作为例:

  • 我们原来的加锁写法是:
package Thread;
class Add{int a = 0;public void add(){for(int i = 0 ; i < 50000; i++){a++;}}
}
public class ThreadDome11 {public static void main(String[] args) {Add a = new Add();Thread t1 = new Thread(()->{a.add();});Thread t2 = new Thread(()->{a.add()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/112613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2048天创作纪念日

2048天创作纪念日 初心收获日常成就憧憬 初心 大一的时候&#xff0c;老师上课说可以通过浏览他人博客或者自己写博客来学习编程。从那以后&#xff0c;写博客这件事情就埋在了我心里&#xff0c;但是我一直没有什么内容想写。直到入选了ACM校队后&#xff0c;需要经常做大量的…

JS数组方法合集(含应用场景)

1.Array.push() 向数组的末尾添加一个或多个元素&#xff0c;并返回新的数组长度。原数组改变 const arr ["apple", "orange", "grape"]; const arr_length arr.push("banana");console.log("arr", arr, "arr_leng…

SpringCloud: sentinel链路限流

一、配置文件要增加 spring.cloud.sentinel.webContextUnify: false二、在要限流的业务方法上使用SentinelResource注解 package cn.edu.tju.service;import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockExcept…

全球剥离抗蚀液行业总体规模、主要厂商及IPO上市调研报告,2023-2029

报告摘要 根据本项目团队最新调研&#xff0c;预计2029年全球剥离抗蚀液产值达到 百万美元&#xff0c;2023-2029年期间年复合增长率CAGR为 %。 本文研究全球剥离抗蚀液总体规模&#xff0c;包括产量、产值、消费量、主要生产地区、主要生产商及市场份额&#xff0c;是一份详细…

vuex报错 Cannot destructure property ‘commit‘ of ‘undefined

在使用vuex中的模块是遇到了一个报错&#xff0c;这个报错的意思是解构一个未定义的对象时发生的。 经过排查发现是在另一个模块的actions中调用了当前模块actions中的方法&#xff0c;没有传任何值&#xff0c;所以无法结构出来commit方法 原代码 //user.js actions: { asy…

图像处理软件Photoshop 2023 mac新增功能 ps 2023中文版

​Photoshop 2023 mac是一款功能强大、易用且灵活的图像编辑软件&#xff0c;旨在满足专业设计师和摄影师的需求。无论您是处理照片、制作图形还是进行艺术创作&#xff0c;Photoshop 2023 都能为您提供丰富的工具和效果&#xff0c;帮助您实现创意想法。Photoshop还支持多种文…

nodejs+vue中学信息技术线上学习系统-计算机毕业设计

因此&#xff0c;将现代化的计算机技术、网络技术以及多媒体等技术相结合&#xff0c;开发基于互联网的自主学习平台&#xff0c;为学生提供良好的自主学习环境&#xff0c;方便学生能够网上学习&#xff0c;师生通过该平台可以进行课后交流。目 录 摘 要 I ABSTRACT II 目 录 …

vue2技能树(6)-事件处理和表单输入绑定

目录 Vue 2 事件处理详解监听事件项目示例 事件修饰符项目示例 内联事件处理项目示例 事件对象项目示例 事件修饰符项目示例 Vue 2 表单输入绑定详解双向数据绑定项目示例 单选框和复选框项目示例 下拉框项目示例 .lazy 修饰符项目示例 &#x1f44d; 点赞&#xff0c;你的认可…

Linux系统之passwd命令的基本使用

Linux系统之passwd命令的基本使用 一、passwd命令介绍1.1 passwd命令简介1.2 passwd命令起源 二、passwd命令的使用帮助2.1 passwd命令的help帮助信息2.2 passwd命令的语法解释 三、查看passwd相关文件3.1 查看用户相关文件3.2 查看组相关文件 四、passwd命令的基本使用4.1 设置…

零信任身份管理平台,构建下一代网络安全体系

随着数字化时代的到来&#xff0c;网络安全已成为企业和组织面临的一项重要挑战。传统的网络安全方法已经无法满足不断演变的威胁和技术环境。近期&#xff0c;中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;发布了《零信任发展研究报告&#xff08; 2023 年&a…

力扣每日一题48:旋转图像

题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],…

【前端】使用tesseract插件识别提取图片中的文字

前言 有时候项目需要识别证照信息&#xff0c;或者拍照搜索内容等。图片处理一般是后端处理比较好&#xff0c;不过前端也有相关插件处理&#xff0c;tesseract.js就是一种前端处理方案。 使用tesseract tesseract更多的语言模型&#xff1a;language配置 安装 Tesseract.…

Linux系统编程_进程间通信第2天: 共享内存(全双工)、信号(类似半双工)、信号量

1. 共享内存概述&#xff08;433.10&#xff09;&#xff08;全双工&#xff09; 2. 共享内存编程实现&#xff08;434.11&#xff09; 共享内存&#xff08;Shared Memory&#xff09;&#xff0c;指两个或多个进程共享一个给定的存储区 特点 共享内存是最快的一种 IPC&…

Bootstrap的导航栏设计相关知识

Bootstrap的导航栏设计相关知识 目录 01-基础知识02-最基本的导航栏设计例子03-带下拉菜单的导航04-在导航栏中添加表单元素05-固定导航栏的位置(如固定到顶部和底部)06-设计导航栏的颜色和文本颜色 01-基础知识 导航栏是网页设计中不可缺少的部分&#xff0c;它是整个网站的…

Elasticsearch 8.9启动时构建接收Rest请求的hander过程源码

一、main方式入口二、Elasticsearch初始化第三阶段1、构造node节点对象时构造restController2、在node构建对象最后执行初始化RestHanders的操作 三、以注册在hander中的RestGetIndicesAction对象为例介绍1、继承了BaseRestHandler&#xff0c;routes方法做路由规则&#xff0c…

Qt作业九

1、思维导图 2、作业 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer> #include <QTime> #include <QTimerEvent> #include <QTextToSpeech>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAME…

Linux网络-UDP/TCP协议详解

Linux网络-UDP/TCP协议详解 2023/10/17 14:32:49 Linux网络-UDP/TCP协议详解 零、前言一、UDP协议二、TCP协议 1、应答机制2、序号机制3、超时重传机制4、连接管理机制 三次握手四次挥手5、理解CLOSE_WAIT状态6、理解TIME_WAIT状态7、流量控制8、滑动窗口 丢包问题9、拥塞控制…

数据库系统>并发控制

1.数据库系统架构设计知识 1.1练习题1 在数据库系统中&#xff0c;“事务”是访问数据库并可能更新各种数据项的一个程序执行单元。为了保证数据完整性&#xff0c;要求数据库系统维护事务的原子性、一致性、隔离性和持久性。针对事务的这4种特性&#xff0c;考虑以下的架构设…

Linux - 还不懂 gdb 调试器?(调试软件)

前言 当前&#xff0c;我们可以使用 make/makefile 来程序化执行代码文件&#xff1b;可以使用 gcc/g 等编译器来编译代码&#xff1b;可以使用 vim 编辑器来编写代码&#xff1b;其实在 Linux 当中还有一个工具&#xff0c;可以实现调试工作&#xff0c;这个工具就是 -- gdb。…

CSS 效果 圆形里一个文字居中

效果实现源码&#xff1a; 宽度&#xff0c;高度必须确认&#xff0c;且相等 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>.circlew {width: 45px;height: 45p…