一、并发编程之----AQS上

2023-09-22 14:05:28

对于一个程序员来说,需要解决多线程问题,这就需要好好学习下并发了。
并发编程设计比较广泛,那我们就先从线程、进程开始吧

一、线程、进程

二、并发

1、为什么会出现

2、是什么

并发是针对一个共享变量,多个线程同一时间去编辑该共享变量。

3、会出现什么问题

其中一个线程a获取到共享变量x后进行修改,而这一时刻,线程b拿到了共享变量x,也需要进行修改,这样a修改后的值不能被b里面看到

3.并发跟并列的区别

并发是多个线程抢占同一个资源
并列是多个线程,分别使用不同资源,同时运行

简单点来说,对于操作系统来说,并发是多个线程抢占同一个cpu,并列是多个线程在多核cpu下同时运行,每个线程占用一个cpu

生活中例子,我们去买东西,如果只有一个收银窗口,我们就需要排队了,这就是并发。这时候,超市看人多,又开了几个窗口,然后队伍就分为成几个队,这几个队就是并发了

为了能够保证程序的正常运行,就出现了锁

三、锁

1、锁分类

1、按照java代码来分

分为synchronzied这种java自带的关键字,juc下面的并发包,并发包里面类都是基于AQS来的。

四、AQS

1、是什么

AQS就是AbstractQueuedSynchronizer,抽象队列同步器,是JUC的核心基础组件。
它定义了一些公共方法,这些方法解决了同步时的一些细节,通过模板模式,子类通过实现里面的抽象方法,来管理同步状态

2、核心原理

AQS里面定义了一个state状态跟一个FIFO先进先出的双向队列。state表示同步状态,FIFO队列里面存放着拿到锁的线程跟正在排队等待锁的线程。
里面一个核心的数据结构是CLH(Craig, Landin, and Hagersten locks)的改良。
CLH是自旋锁的一个优化,那我们就先从自旋锁开始讲起

五、自旋锁

1、是什么

它是互斥锁的一种实现。具体思想是:一直在循环,直到当前线程成功拿到锁。
自旋锁是不断的检测锁是否被释放,不是让线程挂起或睡觉。
互斥锁是获取锁失败后,将进入到睡眠或阻塞状态

2、实现方式

 public void lock() {
        Thread currentThread = Thread.currentThread();
        // 如果锁未被占用,则设置当前线程为锁的拥有者
        while (!owner.compareAndSet(null, currentThread)) {
        }
    }

    public void unlock() {
        Thread currentThread = Thread.currentThread();
        // 只有锁的拥有者才能释放锁
        owner.compareAndSet(currentThread, null);
    }

自旋锁使用compareAndSet方法,compareAndSet方法底层是通过CAS实现的,通过比较替换,直到成功获取到锁。
具体CAS讲述,请看 二、并发编程之----CAS

3、优缺点

优点:实现简单,能保证线程一定能拿到锁,同时避免了操作系统进程调度和线程之间的上下文切换。

缺点:
1)锁饥饿问题:在锁竞争激烈的情况下,可能会导致某个线程一直获取不到锁
2)性能低:在多处理器机器上,每个线程对应的处理器都对同一个变量进行读写,而每次读写操作都将要同步每个处理器缓存,导致系统性能严重下降。

适用场景:锁竞争不激烈、锁持有时间短

六、CLH

1、是什么

CLH是自旋锁的改良,进行了哪些改良呢?
1)它定义了一个队列,将线程放入到队列中,这样保证先请求的线程先获取到锁,避免了饥饿问题。
2)每个线程各自轮询自己的本地变量

2、优缺点

优点:
1)公平锁。先入队的线程会先得到锁。
2)实现简单,易于理解。
缺点:
1)没有拿到锁,还是进行了循环等待
2)锁功能单一

3、实现原理

类似一个链表队列,队尾有一个tail指针,当有新的线程进入时,先通过tail获取到队尾的节点,然后新线程加入队尾,并且tail就指向该线程。入队成功后,判断前一个节点是否已经释放锁,如果已经释放,就拿到了该锁。如果没有释放,就一直循环判断前一个节点是否释放锁

4、AQS的CLH

AQS对CLH锁进行了优化。将自旋改为阻塞线程操作,并对锁进行了改造和扩展。
1)扩展了每个节点的状态
每个节点状态分的更细了,有正常等待、超时或取消等。如果前一个队列状态为超时或取消,这个节点就可以使用前面一个节点的状态了
2)将链表队列变成双向队列
将自旋改为阻塞后,需要释放锁的节点会显示的通知下一个节点解除阻塞。

更多推荐

从统计语言模型到预训练语言模型---预训练语言模型(Transformer)

预训练模型的概念在计算机视觉领域并不陌生,通常我们可以在大规模图像数据集上预先训练出一个通用模型,之后再迁移到类似的具体任务上去,这样在减少对图像样本需求的同时,也加速了模型的开发速度。计算机视觉领域采用ImageNet对模型进行一次预选训练,使得模型可以通过海量图像充分学习如何提取特征,然后再根据任务目标进行模型精调

针对 SAP 的增强现实技术

增强现实技术是对现实世界的一种交互式模拟。这种功能受到各种企业和制造商的欢迎,因为它可以减少生产停机时间、快速发现问题并维护流程,从而提高运营效率。许多安卓应用都在探索增强现实技术。使用增强现实技术(AR)的LiquidUI可以让SAP用户通过粗略分类来检测和识别多个对象,从而构建实时可视化搜索体验。因此,可以为用户提

Solid框架节点级响应性

前言随着组件化、响应式、虚拟DOM等技术思想引领着前端开发的潮流,相关的技术框架大行其道,就以目前主流的Vue、React框架来说,它们都基于组件化、响应式、虚拟DOM等技术思想的实现,但是具有不同开发使用方式以及实现原理,这里就不再赘述了相关内容,这里关注的焦点在于虚拟DOM。无论是Vue还是React都应用虚拟DO

matlab检索相似图像

在Matlab中检索相似图像通常需要使用图像处理和计算机视觉技术。以下是一种常见的方法,可以帮助您在Matlab中进行相似图像检索:准备图像数据库:首先,您需要有一个包含待检索图像的图像数据库。这些图像应该经过预处理,例如调整大小和标准化,以确保它们具有一致的特征。提取图像特征:对于每张图像,使用Matlab的图像处理

进销存ERP系统源码 基于springboot+vue开发

进销存ERP系统源码基于springboot+vue开发技术框架Springboot2.2.2.RELEASEMyBatis-plus3.4.2Spring-session-data-redis2.2.0.RELEASEHuTool5.7.17Lombok1.18.10EasyExcel2.2.10JDK1.8Mysq

【cmake开发(6)】Cmakelists 使用 gcc/g++指定版本,find_package 基本原理

我们在《【cmake开发(5)】cmake设置常规变量、环境变量、内置变量;cmake带参数编译和-D选项;c++源码通过-D选项的宏定义进行条件编译》中提到了变量。文章目录回顾一、指定编译器二、find_package基本原理2.1如果不使用find_package2.2如果使用find_package2.3find

Dubbo学习(二)——dubbo环境搭建

文章目录dubbo核心简介SpringCloud与Dubbo的区别Dubbo的架构说明dubbo和Feign远程调用的差异共同点:区别:基于SpringBoot开发微服务应用项目介绍1.启动注册中心2.新建一个springboot项目3.添加Maven依赖4.定义服务接口5.定义服务端的实现实现接口配置服务端Yaml配

搭建Android自动化python+appium环境

一.需要软件JDK:JAVA安装后配置JDK环境SDK:SDK下载后配置adb环境Python:pyhton语言Pycharm:python脚本编译工具Appium-python-client:pyhton中的库Appium客户端二.搭建步骤1.配置JDK环境①.下载安装java:https://www.oracle.

【vue2第十八章】VueRouter 路由嵌套 与 keep-alive缓存组件(activated,deactivated)

VueRouter路由嵌套在使用vue开发中,可能会碰到使用多层级别的路由。比如:其中就包含了两个主要页面,首页,详情,但是首页的下面又包含了列表,喜欢,收藏,我的四个子路由。此时就需要配置子路由通过使用children:importVuefrom'vue'importAppfrom'./App.vue'importM

【数据结构】单值二叉树 & 相同的树 & 翻转二叉树(五)

目录一,单值二叉树题目详情:解法:父子比较法解题思路:思路实现:源代码:二,相同的树题目详情:解法:比较法解题思路:思路实现:源代码:三,翻转二叉树解法:替换法解题思路:思路实现:源代码:一,单值二叉树题目详情:如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树;只有给定的树是单值二叉树时返回true;否则返

小白的入门二叉树(C语言实现)

前言:二叉树属于数据结构的一个重要组成部分,很多小白可能被其复杂的外表所吓退,但我要告诉你的是“世上无难事,只怕有心人”,我将认真的对待这篇博客,我相信只要大家敢于思考,肯定会有所收获的,当我们攀过一座山,回头看去,可能当初畏惧的大山也不过如此。目录前言:一,树的基本知识1树的概念2,树相关概念二,二叉树的基本知识1,

热文推荐