当前位置: 首页 > news >正文

并发编程2

接并发编程1

synchronized锁的实现

通过底层指令控制实现,Java提供的一种原子性内置锁,在进入synchronized后会从主内存复制一份共享变量到自己的工作内存,在工作内存中修改完成后,退出时会把工作内存的值写入到主内存,保证原子性。

synchronized基于进入和退出监视器对象来实现方法同步和代码块同步。

同步方法使用ACC_SYNCHRONIZED标记是否是同步方法,方法调用时,先检测该方法是不是同步的,如果是,进入方法时需要monitorenter,退出时monitorexxit。

monitorenter 检测锁

monitorexxit 释放锁

代码块的同步是利用 monitorenter 和 monitorexit 这两个字节码指令。
在虚拟机执行到 monitorenter 指令时,首先要尝试获取对象的锁。

当前线程拥有了这个对象的锁,把锁的计数器+1;当执行 monitorexit 指
令时将模计数器-1;当计数器为 0 时,锁就被释放了。

synchronized通过在对线头设置标记,来实现获取锁和释放锁。 

 AQS(AbstractQueuedynchronizer)

抽象同步队列

AQS是一个用来构建锁和同步器的框架,是JUC中的核心组件,,常见的ReentrantLock,CountDownLatch等都是基于AQS实现的。

AQS实现原理

在AQS类的内部有一个state变量表示锁是否被使用,初始化为0,在多线程情况下,线程要执行临界区代码,首先要获取state,获取成功后state+1,其他线程正在获取时由于共享资源已被占用,会进入一个双端队列FIFO等待,等占有state的线程执行完临界区的代码释放资源后state-1,会唤醒FIFO中的下一个等待的线程(head的下一个节点)去获取state。

 AbstractQueuedynchronizer成员

private transient volatile Node head;
private transient volatile Node tail;
/*使用变量 state 表示锁状态,0-锁未被使用,大于 0 锁已被使用
共享变量 state,使用 volatile 修饰保证线程可见性
*/
private volatile int state;
状态信息通过 getState , setState , compareAndSetState 进行操作.
protected final int getState() { //获得锁状态
return state;
}
//使用 CAS 机制设置状态
protected final boolean compareAndSetState(int expect, int update) {
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}

 ReentrantLock锁实现(互斥锁)

是JUC包下的类,实现了Lock接口,提供了与SYNCHRONIZED不同的另一种同步操作方式,更加灵活。

基于AQS,在并发编程中可以实现公平锁与非公平锁来对资源进行同步。首先 AQS 中的 state 为 0.

A 线程在执行 lock() 方法后,以独占方式 CAS state 为 1。AQS 会记录 A 线程为当前的独占线程,其他线程如果再尝试获取资源,就会进入等待队列,直到 A 线程调用 unlock() 方法,释放了资源,即 state 回归 0 状态。

在“重入性”方面,如果A线程第二次尝试取锁,state 会累加。也就是说,上锁的次数一定等于释放锁的次数。

CountDownLatch(共享锁)

底层实现是通过AQS来完成的。

CountDownLatch 允许一个线程等待其他线程各自执行完毕后再执行,可以延迟线程的进度直到终止状态。与 ReentrantLock 不同的是,在构造 CountDownLatch 对象的时候,会先设定一个 state 大小:

每当一个线程执行完毕后,AQS 内部的 state 就-1,当 state 的值为
0 时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。

JUC常用类

ConcurrentHashMap

是一个线程安全的哈希表,对于多线程的操作,结余HashMap与Hashtable之间,内部采用“锁分段”机制。 

放弃分段锁的原因:

1.加入多个分段锁浪费内存空间

2.map再放入时竞争一个锁的概率很小,分段锁反而会造成更新操作的长时间等待。

jdk8后采用Node锁,减小锁的粒度,提高性能,使用CAS操作来保证原子性。

实现原理

put 时首先通过 hash 找到对应链表过后,查看是否是第一个 Node,如果是,
直接用 cas 原则插入,无需加锁。
然后, 如果不是链表第一个 Node, 则直接用链表第一个 Node 加锁,这里加
的锁是 synchronized。
ConcurrentHashMap 不支持存储 null 键和 null 值.
为了消除歧义
ConcurrentHashMap 不能 put null 是因为 无法分辨是 key 没找到的 null 还
是有 key 值为 null,这在 多线程 里面是模糊不清的,所以就不让 put null。

CopyOnWriteArrayList

ArraayList 是线程不安全的,在高并发情况下可能会出现问题, Vector 是线 程安全的。
JDK 中提供了 CopyOnWriteArrayList 类,将读取的性能发挥到极致,取是完
全不用加锁的,并且更厉害的是: 写入也不会阻塞读取操作,只有写入和写入之
间需要进行同步等待, 读操作的性能得到大幅度提升。

原理:

CopyOnWriteArrayList 类的所有可变操作(add,set 等等)都是通过创建底
层数组的新副本来实现的。当 List 需要被修改的时候,并不直接修改原有数组
对象,而是对原有数据进行一次拷贝,将修改的内容写入副本中。写完之后,再
将修改完的副本替换成原来的数据,这样就可以保证写操作不会影响读操作了。

CopyOnWriteArraySet

基于CopyOnWriteArrayList实现,不能存储重复数据。

文章参考:一文搞懂到底什么是 AQS 

                  Java 多线程 —— AQS 详解

相关文章:

并发编程2

接并发编程1 synchronized锁的实现 通过底层指令控制实现,Java提供的一种原子性内置锁,在进入synchronized后会从主内存复制一份共享变量到自己的工作内存,在工作内存中修改完成后,退出时会把工作内存的值写入到主内存&#xff…...

Linux 中 Git 使用指南:从零开始掌握版本控制

目录 1. 什么是 Git? Git 的核心功能: 2. Git 的安装 Ubuntu/Debian 系统: 验证安装: 3.gitee库 4. Git 的首次配置 配置用户名和邮箱: 查看配置: 5. Git 的基本使用 初始化仓库 添加文件到暂存区…...

C# Exe + Web 自动化 (BitComet 绿灯 自动化配置、设置)

BitComet GreenLight,内网黄灯转绿灯 (HighID), 增加p2p连接率提速下载-CSDN博客 前两天写个这个,每次开机关机后要重来一遍很麻烦的索性写个自动化。 先还是按照上面的教程自己制作一遍,留下Luck 以及 路由器相关的 端口记录信息。 (因为自…...

2024年12月CCF-GESP编程能力等级认证C++编程四级真题解析

四级真题的难度: 一、总体难度评价 CCF-GESP编程能力等级认证C++四级真题的难度通常被认为相对较高。它不仅要求考生具备扎实的C++编程基础,还需要考生掌握一定的算法和数据结构知识,以及良好的问题解决能力。 二、具体难度分析 ‌理论知识考察‌: 单选题和判断题中,会涉…...

谷歌Chrome或微软Edge浏览器修改网页任意内容

在谷歌或微软浏览器按F12,打开开发者工具,切换到console选项卡: 在下面的输入行输入下面的命令回车: document.body.contentEditable"true"效果如下:...

《DeepSeek深度使用教程:开启智能交互新体验》Deepseek深度使用教程

《DeepSeek使用教程:开启智能交互新体验》 在当今数字化时代,人工智能技术正以前所未有的速度改变着我们的生活和工作方式。DeepSeek作为一款强大的人工智能工具,凭借其卓越的自然语言处理能力和多领域应用潜力,受到了众多开发者…...

Dijkstra算法

Dijkstra算法(迪杰斯特拉算法)是一种经典的单源最短路径算法,用于在加权图中找到从一个源点到所有其他顶点的最短路径。它要求图中不能有负权边,因为负权边可能会导致算法的贪心策略失效。 Dijkstra算法的基本思想 Dijkstra算法…...

Python中的静态方法如何使用?

在Python里,类当中的方法可以分为多种不同的类型,其中staticmethod是一个十分有趣而又实用的功能。我们来好好地聊一聊什么是静态方法,它的用途是什么,以及如何在实际应用中使用它们! 首先,定义一下静态方…...

【最后203篇系列】016 Q201架构思考

前言 Q200已经达到了我既定的目标,在最近的3个月,我需要进一步完善,达到可以试产的程度。 在这个过程当中,许多知识和体会一直在变。 qtv200到目前,虽然通过习惯(每晚运行离线策略和比对)方式维持了注意力的集中&…...

小脑萎缩会致命吗?

小脑萎缩,顾名思义,是指小脑的体积减小或结构发生异常,进而影响其正常功能。小脑作为人体重要的协调和运动控制中心,负责维持身体平衡、调节肌肉张力和协调运动等关键功能。当小脑出现萎缩时,患者可能会出现步态不稳、…...

pip install和conda install的区别

这里写目录标题 一、什么是 Python 依赖(Python Dependencies)?1. 依赖的作用2. 如何管理 Python 依赖3. 依赖管理问题4. 依赖锁定总结 二、使用pip安装包venv隔离环境方法 1:使用 venv(推荐)创建虚拟环境激…...

這是我第一次寫關於aapenal服務器管理控制面板的文章

首先我們來認識一下服務器管理面板的所有功能  網站管理功能: 支持創建和管理多個網站。配置虛擬主機(Vhost)和域名綁定。自動安裝常用應用(如WordPress、Joomla等)。  文件管理功能: 文件上傳、…...

requests库的request和response对象的属性和方法

Python requests库 request 参数信息 response 参数信息...

8664蛋糕的美味值

8664蛋糕的美味值 ⭐️难度:中等 🌟考点:枚举 📖 📚 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in );int n sc.nextInt();int k s…...

【MySQL】数据库简要介绍和简单应用

目录 数据库简要介绍 SQL 的简单应用 需要注意的: 数据库简要介绍 数据库(database)是指长期存储在计算机内,有组织的、可共享的数据集合。它可视为一个电子化的文件柜,用来存储电子文件,用户可以对文件中的数据进行査询、新增、更新、删…...

yolo环境 pytorch环境配置 CUDA安装

我的成功案例:首先安装python 3.12.9的conda虚拟环境 (如果不安装3.12的会报错误ModuleNotFoundError:没有名为“numpy._core”的模块) 然后安装11.8cuda (其实我是可以最高安装12.6的cuda但我实测,太高版…...

camellia redis proxy v1.3.3对redis主从进行读写分离(非写死,自动识别故障转移)

1 概述 camellia-redis-proxy是一款高性能的redis代理(https://github.com/netease-im/camellia),使用netty4开发,主要特性如下: 支持代理到redis-standalone、redis-sentinel、redis-cluster。支持其他proxy作为后端…...

python相关语法的学习文档1

python相关语法的学习文档1 1、tqdm tqdm 是 Python 中一个非常流行的进度条库,可以实时显示循环或任务的进度。它简单易用,支持多种场景(如循环、文件处理、多线程/进程等)。以下是详细的使用讲解: 1.1 安装 pip install tqdm1.2 基本用法 from tqdm import tqdm impo…...

Web元件库 ElementUI元件库+后台模板页面(支持Axure9、10、11)

Axure是一款非常强大的原型设计工具,它允许设计师和开发者快速创建高保真原型,以展示应用或网站的设计和功能。通过引入各种元件库,如ElementUI元件库,可以极大地丰富Axure的原型设计能力,使其更加贴近实际开发中的UI组…...

Java 并发编程——BIO NIO AIO 概念

参考 Java 并发编程——BIO NIO AIO 概念 阻塞与非阻塞、同步与异步概念 系统调用、缓存、物理设备阻塞与非阻塞同步与异步 四种主要的 IO 模型 同步阻塞 IO同步非阻塞 IOIO 多路复用异步 IO select,poll,epoll 系统调用命令...

在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别

在微信小程序或前端开发中,picker 和 select 都是用户交互中用于选择的组件,但它们在功能、设计和使用场景上有一定的区别。 1. picker 的特点 描述: picker 是微信小程序中的原生组件,通常用于选择单项或多项值,如时…...

笔记本 Win10 部署阿里通义千问 1.5-0.5B 大模型 mini 版

文章目录 1.环境准备1.1 硬件环境1.2 OS 环境1.3 Python 环境 2.环境安装2.1 CUDA 驱动下载安装2.2 torch 库下载安装2.3 transformers 库安装2.3 accelerate 库安装2.4 验证 CUDA 是否可用2.5 下载 Qwen1.5-0.5B 大模型 3.测试大模型3.1 加载大模型3.2 简单对话3.3 亲测体验感…...

SpringBoot事件驱动

1、概述 Spring事件驱动采用了观察者设计模式,主要作用就是实现对象之间的松耦合通信。它的核心思想是通过事件的发布和监听来实现不同组件之间的交互。(跟mq挺像) 基础概念: 事件(Event): 在Spring中&am…...

nginx中间件部署

普通权限账户安装NGINX中间件 1、拥有高级权限的账户安装必要的插件 sudo yum install -y gcc-c make pcre pcre-devel zlib zlib-devel openssl openssl-devel 2、普通账户进行NGINX的脚本式安装 vi nginx_intall.sh #!/bin/bash TAR_NAME"$1" TAR_NAME_DIRba…...

Qt程序基于共享内存读写CodeSys的变量

文章目录 1.背景2.结构体从CodeSys导出后导入到C2.1.将结构体从CodeSys中导出2.2.将结构体从m4文件提取翻译成c格式 3.添加RTTR注册信息4.读取PLC变量值5.更改PLC变量值 1.背景 在文章【基于RTTR在C中实现结构体数据的多层级动态读写】中,我们实现了通过字符串读写…...

vulnhub-Hackme-隧道建立、SQL注入、详细解题、思路清晰。

vulnhub-Hackme-隧道建立、SQL注入、详细解题、思路清晰。 一、信息收集 2025.3.14 PM 12:18 1、主机发现 arp-scan -l nmap -sn 192.168.66.0/24 2、端口扫描 1、nmap --min-rate 10000 -p- 192.168.66.182 -oA port 查看所有开放端口2、map -sS -sV 192.168.6…...

技术-NBIOT

是什么? 窄带物联网(Narrow Band Internet of Things, NB-IoT)成为万物互联网络的一个重要分支支持低功耗设备在广域网的蜂窝数据连接,也被叫作低功耗广域网(LPWAN)NB-IoT支持待机时间长、对网络连接要求较高设备的高效连接NB-Io…...

【论文阅读】AlexNet——深度学习奠基作之一

原文链接 Step 1 1. titleabstract 第一句:告诉我干了什么事情 我们训练了一个很大很深的卷积神经网络,用来对120w个图片作分类,这里面有1000个类 第二句:结果 在测试集上面,top-1 error37.5%,top-517.0…...

【云原生技术】编排与容器的技术演进之路

一、编排与容器的技术演进之路 1.1 DockerClient 此时 K8s 只是编排领域的一个选择,而 Docker 此时一家独大,所以 K8s 的客户端只 是作为 Docker 的客户端来调用 Docker 引擎来完成服务。 1.2 RUNC&Shim OCI催生 runcrunc,剥离 Docke…...

鸿蒙编译框架插件HvigorPlugin接口的用法介绍

鸿蒙系统中HvigorPlugin接口实现自定义编译插件,实现编译前后自定义功能。 在鸿蒙(HarmonyOS)开发中,HvigorPlugin 是用于扩展 Hvigor 构建工具功能的接口。通过实现此接口,开发者可以自定义构建任务、修改构建流程或…...

Springboot+mybatis实现增删改查操作

继续写一下删除操作,删除有些不一样,首先在controller里面,我们需要改一下路由,我们后面要写/{id}传入路径参数,用PathVariable注解绑定id,剩下的都一样,传入id,然后写service和mapp…...

Java中的I/O

1.I/O流 1.1I/O概述 1.2.基本用法 1.3.字节输出流写数据的细节 1.4.FileOutPutStream写数据的三种方式 明天再更~~~~,先混个流量券。...

前端组件封装艺术:设计原则与最佳实践指南

文章目录 一、组件封装的核心原则1.1 设计原则概览1.2 组件生命周期 二、组件设计准则2.1 单一职责原则2.2 高内聚低耦合 三、组件接口设计3.1 Props设计规范3.2 代码示例 四、组件状态管理4.1 状态设计原则4.2 代码示例 五、组件样式处理5.1 样式方案对比5.2 代码示例 六、组件…...

SpringMVC(五)拦截器

目录 拦截器基本概念 一 单个拦截器的执行 1 创建拦截器 2 SpringMVC配置,并指定拦截路径。 3 运行结果展示: 二 多个拦截器的执行顺序 三 拦截器与过滤器的区别 拦截器基本概念 SpringMVC内置拦截器机制,允许在请求被目标方法处理的…...

jupyter无法转换为PDF,HTMLnbconvert failed: Pandoc wasn‘t found.

无法转为PDF 手动下载工具 https://github.com/jgm/pandoc/releases/tag/3.6.3 似乎跟我想的不大一样,还有新的报错 https://nbconvert.readthedocs.io/en/latest/install.html#installing-tex 不知道下的啥玩意儿 sudo apt-get install texlive-xetex texlive-fon…...

【红黑树】—— 我与C++的不解之缘(二十五)

前言 学习了avl树,现在来学习红黑树。 一、什么是红黑树 红黑树是一颗平衡二叉搜索树,它每一个节点增加了一个存储位表示节点的颜色,可以是红色或者黑色。 相比较于AVL树,红黑树也是一个自平衡二叉搜索树,但是它与AVL树…...

机器学习 Day05 pandas库

1.pandas介绍和优点 Pandas 是 2008 年由 Wes McKinney 开发的开源 Python 库 。它专门用于数据挖掘和数据分析,具有以下特点: 数据结构独特:核心数据结构为 Series(一维)和 DataFrame(二维) …...

布达佩斯召开 | 2025年第五届能源与环境工程国际会议(CoEEE 2025)

会议简介 Brief Introduction 2025年第五届能源与环境工程国际会议(CoEEE 2025) 会议时间:2025年7月25日-27日 召开地点:匈牙利布达佩斯 大会官网:www.coeee.org CoEEE 2025将围绕“能源与环境工程”的最新研究领域而展开,为研究人…...

[C语言日寄] qsort函数的练习

【作者主页】siy2333 【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是…...

单引号与双引号在不同编程语言中的使用与支持

在编程语言中,单引号和双引号是常见的符号,它们通常用来表示字符和字符串。然而,如何使用这两种符号在不同的编程语言中有所不同,甚至有一些语言并不区分单引号和双引号的用途。本文将详细介绍不同编程语言中单引号与双引号的支持…...

Next.js项目实战——MindAI

我的整个毕业论文,是基于Next.js搭建完成的。项目的搭建过程分为多个章节,循序渐进: 1.环境准备与项目初始化 Node.js和npm的安装配置创建Next.js 14项目TypeScript配置项目目录结构说明Git初始化和.gitignore配置 2.基础架构搭建 Tailwi…...

MindGYM:一个用于增强视觉-语言模型推理能力的合成数据集框架,通过生成自挑战问题来提升模型的多跳推理能力。

2025-03-13,由中山大学和阿里巴巴集团的研究团队提出了MindGYM框架,通过合成自挑战问题来增强视觉-语言模型(VLMs)的推理能力。MindGYM框架通过生成多跳推理问题和结构化课程训练,显著提升了模型在推理深度和广度上的表…...

WPS的Excel文档如何利用VB脚本批量替换超链接的内容

准备知识 关于WPS的Excel点击单元格打开别的文档的两种方法的探究【为单元格添加超链接】 https://blog.csdn.net/wenhao_ir/article/details/146212767 激活WPS的Excel文档中的VB编辑器功能 没有激活前的截图如下: 原因是我们的电脑中缺乏VBA插件,我们点击“开发工具”:…...

phpstudy+phpstorm+xdebug【学习笔记】

配置PHPStudy 配置PHPSTORM phpstorm选择PHP版本 配置DEBUG 设置服务器 编辑配置 学习参考链接::https://blog.csdn.net/m0_60571842/article/details/133246064...

(包清楚解疑)ES6中__dirname和__filename不见了吗?,到底怎么用

我们知道,在commonJs中,__dirname和__filename分别表示当前js文件所在目录路径和所在路径的绝对路径。可以直接使用,但是在ES6和Node v20.11.0之后,不能直接用了。 首先明确一下这两个变量为什么会用到: 当我们在使用…...

3.4 基于TSX的渲染函数类型安全实践

文章目录 1. TSX与类型安全的核心价值1.1 TSX的独特优势1.2 类型安全的核心收益2. 基础类型安全实践2.1 组件Props类型约束2.2 子元素类型校验2.3 事件类型系统3. 高级类型安全模式3.1 泛型组件设计3.2 高阶组件类型3.3 类型守卫应用4. 类型操作工具集4.1 实用类型工具4.2 类型…...

vue-draggable-plus实现某些子元素不被拖拽

在使用vue-draggable-plus时倘若只是节点里面所有元素都可以拖拽倒还好实现,但遇到某些子元素是作为其他作用不可拖拽或者可拖拽不可替换这些情况,则比较头疼了 解决: 1. 绑定移动事件 2. 处理移动世界并对对应情况返回false //移动事件 co…...

基于SpringBoot的Mybatis和纯MyBatis项目搭建的区别

【由于之前学习MyBatis的时候是跟着视频敲的纯MyBatis项目,以至于在突然看到别人在SpringBoot项目里搭建MyBatis方式的时候很懵比…特此文字形式记录一下区别(应该还有好多种其他方式是我不知道的,主要应该就是要知道关键的流程步骤&#xff…...

二进制数(十进制转二进制)

二进制数 #include<stdio.h> int main(){int n;while(scanf("%d",&n)!EOF){int a[10000];int i0;if(n0){printf("0\n");continue;}while(n){a[i]n%2;i;nn/2;}for(int ji-1;j>0;j--){printf("%d",a[j]);}printf("\n");}…...

一周学会Flask3 Python Web开发-SQLAlchemy添加数据操作-班级模块

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili SQLAlchemy提供session.add()方法添加model实体数据&#xff0c;以及提供session.commit()提交事务。 首先list.html加一个添…...