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

并发编程小记---5.17

final类型的特点final 变量赋值后不能改引用地址不可变final 方法不能被子类重写final 类不能被继承引用类型Java 数据类型就两种基本数据类型byte short int long float double char boolean引用数据类型除了上面 8 种剩下全是引用类型基本类型变量里直接存真实值引用类型变量里不存真实对象只存对象在堆内存的地址引用打个比方基本类型手里直接拿着苹果引用类型手里拿的是地址纸条苹果放在仓库堆内存里常见引用类型有哪些类自己定义的类、String、Date接口数组数组永远是引用类型集合List、Map、Set等想要子线程修改主线程的共享变量、并且主线程能感知到必须用引用类型。如果用基本类型子线程改不了主线程的变量。基于其他线程计算结果上进行计算怎么计算结果一定是正确的利用synchronized保证写后读想要基于其他线程结果计算不出错一定要等前置线程执行完毕再取值计算不要并发抢跑。synchronized关键字的对象锁机制一次只能调用一个当一个线程进入任意一个加了synchronized的方法时它会拿到这个对象的锁其他线程想调用这个对象上的任何synchronized方法都必须等待锁被释放直到第一个线程执行完方法、退出临界区锁才会被释放其他线程才有机会拿到锁执行synchronized一定要在写以后再释放否则可能无效!!多进程、多线程、多服务器保证结果对一定是写后读一、Lock 指令一、Lock 前缀指令的核心作用Lock前缀指令是处理器实现原子性操作的底层保障主要作用有两点强制缓存回写触发处理器将修改后的缓存数据写回主内存。保证独占访问在多处理器环境中通过LOCK信号确保指令执行期间处理器对共享内存的独占访问从而保证操作的原子性。二、处理器锁机制的演进从总线锁到缓存锁处理器 / 架构锁实现方式特点Intel 486 / Pentium总线锁锁操作时始终在总线上声明LOCK信号锁定整个系统总线开销大。P6 架构及现代处理器缓存锁优化方案若访问的内存区域已在处理器缓存中则不锁总线而是1. 锁定该内存区域对应的缓存行2. 修改后直接回写内存3. 利用缓存一致性协议保证原子性开销远低于总线锁三、缓存锁的工作原理触发条件当处理器检测到操作的内存地址已被自身缓存时会自动启用缓存锁而非总线锁。核心机制依赖缓存一致性协议如 MESI阻止多个处理器同时修改同一内存区域的缓存副本从而在缓存层面实现独占访问。优势仅锁定单个缓存行不影响其他内存区域的访问大幅降低锁操作的性能开销。四、关键概念总结总线锁早期处理器实现原子性的粗暴方式锁定整个系统总线所有处理器都无法访问内存性能开销极大。缓存锁现代处理器的优化方案利用缓存一致性协议锁定单个缓存行仅影响被修改的数据性能开销大幅降低。LOCK信号总线锁的核心信号用于在总线上声明独占访问现代处理器仅在无法使用缓存锁时如跨多个缓存行才会触发。二、volatile优化原理AtomicReference通过追加变量把共享变量的总大小填充到64 字节。计算对象引用占 4 字节加上 15 个填充变量共 60 字节再加上父类的value变量刚好凑齐 64 字节。缓存行的特性英特尔酷睿 i7/Atom/Core Solo/Pentium M 等处理器的L1/L2/L3 缓存行宽度为 64 字节且不支持部分填充缓存行。若两个变量比如队列的头节点和尾节点加起来不足 64 字节它们会被读入同一个缓存行。伪共享的危害当多个处理器分别修改这两个变量时会触发缓存一致性协议的锁定机制。修改其中一个变量时会锁定整个缓存行导致其他处理器无法访问另一个变量。对于队列这种频繁修改头 / 尾节点的场景会严重降低入队 / 出队效率。缓存行填充的解决思路用额外的字节将变量占满整个 64 字节缓存行让头节点和尾节点分别位于不同的缓存行中。这样修改时只会锁定各自的缓存行不会互相干扰大幅提升并发性能。利用 64 字节缓存行的特性通过填充变量让共享变量独占缓存行避免多线程修改时的缓存行竞争从而提升并发效率但它不是万能的需要结合处理器架构和变量的访问频率来决定是否使用。三、synchronized 的三种锁形式Java 中每一个对象都可以作为锁具体分为 3 种场景场景锁对象特点普通同步方法当前实例对象this不同实例的锁互不影响同一实例的同步方法互斥静态同步方法当前类的Class对象所有实例共享同一把锁全局互斥同步代码块synchronized(...)括号内指定的对象锁粒度更灵活可自定义锁对象JVM 底层实现原理synchronized基于Monitor监视器对象实现同步代码块和方法的实现细节不同同步代码块编译后在同步代码块的开始位置插入monitorenter指令在同步代码块的结束位置和异常处理位置插入monitorexit指令JVM 保证每个monitorenter必须有对应的monitorexit指令配对确保锁一定会被释放同步方法JVM 规范未明确其具体实现细节但同样可以通过monitorenter/monitorexit指令实现也存在其他优化实现方式Monitor 与锁的关系每个 Java 对象都与一个Monitor对象关联当Monitor被线程持有后会进入锁定状态线程执行monitorenter指令时会尝试获取该对象对应Monitor的所有权也就是获取对象锁同一个类的静态同步方法不能被多个线程同时调用而非静态的普通静态方法不加synchronized完全可以被多个线程同时调用。

相关文章:

并发编程小记---5.17

final类型的特点:final 变量:赋值后不能改(引用地址不可变)final 方法:不能被子类重写final 类:不能被继承引用类型:Java 数据类型就两种:基本数据类型:byte short int l…...

tinySPL 与 U-Boot 核心区别

tinySPL 与 U-Boot 核心区别 一、定位本质项目tinySPLU-Boot定位轻量极简二级引导,专为RTOS/裸机设计通用全能大型Bootloader,主打Linux系统体积极小,几十KB级别大,几百KB~数MB设计目标极速启动、轻量化、适配嵌入式轻系统功能最全…...

CNAS实验室一份完整的质量手册需要包含哪些要素?一文教会质量手册编写

编写质量管理体系文件是CNAS实验室认证工作中非常重要的一个环节,实验室质量管理体系文件按照惯例,一般会分为四个层级,质量手册、程序文件、作业指导书和记录文件。实验室质量手册是实验室依据相关标准制定的纲领性文件,系统规定…...

NoSleep:彻底告别电脑自动休眠的终极解决方案

NoSleep:彻底告别电脑自动休眠的终极解决方案 【免费下载链接】NoSleep Lightweight Windows utility to prevent screen locking 项目地址: https://gitcode.com/gh_mirrors/nos/NoSleep 你是否经历过这些令人沮丧的时刻?在线会议进行到关键演示…...

别再只盯着增益了!用Cadence仿真两级比较器,手把手教你搞定噪声、失调和延时

两级比较器Cadence仿真实战:从噪声分析到延时优化的全流程指南 在模拟IC设计领域,比较器作为信号链中的关键模块,其性能直接影响整个系统的精度与响应速度。传统教材往往聚焦于比较器的理论推导,却鲜少提供可落地的仿真验证方法。…...

手把手教你:在STM32F103C8T6上搞定ST25R3911B NFC读卡器(基于RFAL V2.8.0)

在STM32F103C8T6上实现ST25R3911B NFC读卡器的完整移植指南 对于嵌入式开发者来说,将NFC功能集成到资源受限的MCU上是一项常见但充满挑战的任务。本文将详细介绍如何在STM32F103C8T6这款经典Cortex-M3 MCU上,成功移植ST25R3911B NFC读卡器驱动和RFAL库(V…...

英雄联盟个性化工具终极指南:3分钟免费打造专属游戏身份

英雄联盟个性化工具终极指南:3分钟免费打造专属游戏身份 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 想要在英雄联盟中展示与众不同的个人资料吗?LeaguePrank是一款开源免费的英雄联盟个性化工具&am…...

告别驱动烦恼:用TI官方CCS开发MSP430,为什么比第三方IAR更省心?

嵌入式开发者的效率革命:为什么TI官方CCS是MSP430开发的最优解? 在嵌入式开发领域,工具链的选择往往决定了项目的启动速度和开发体验。对于MSP430系列微控制器的开发者而言,面对IAR、GCC和TI官方的Code Composer Studio(CCS)等多种…...

Firefly-RK3399从Ubuntu 16.04到自定义Rootfs:手把手教你编译内核与打包固件

Firefly-RK3399从Ubuntu 16.04到自定义Rootfs:手把手教你编译内核与打包固件 在嵌入式开发领域,能够自主定制系统镜像是一项极具价值的能力。Firefly-RK3399作为一款性能强大的开发板,其开放的架构为开发者提供了深度定制的可能性。本文将带你…...

Hermes Agent框架对接Taotoken自定义供应商的配置指南

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Hermes Agent框架对接Taotoken自定义供应商的配置指南 对于使用Hermes Agent框架的开发者而言,能够灵活接入不同的模型…...

get_kline_serial 用法:K 线序列长度、末尾行与新 bar 判定

前言 分钟线、小时线策略里,指标几乎都挂在 get_kline_serial 返回的序列上。我常见三类报错:长度不够就访问 iloc[-20]、把未收盘的 close 当成定稿信号、以及同一根 K 线里重复下单。下面按天勤量化里的订阅方式、长度防护和与 is_changing 的配合写一…...

不止是‘小电脑’:用树莓派4B+Python+传感器,手把手打造你的第一个智能家居原型

从零构建智能家居中枢:树莓派4B实战指南 当一块信用卡大小的电路板能够控制你家的灯光、监测室内环境并自动调节空调时,传统家电的边界就被彻底打破了。树莓派4B以其不到400元的售价和完整的计算机架构,正在重新定义智能家居的入门门槛。本文…...

深入理解STM32的PWM:从CubeMX配置到用HAL库精准控制舵机角度(以F103为例)

深入理解STM32的PWM:从CubeMX配置到用HAL库精准控制舵机角度(以F103为例) 在机器人控制、自动化设备等需要精确位置反馈的应用场景中,舵机的精准控制往往是项目成败的关键。许多开发者虽然能够通过PWM实现基本的0、90、180三档控制…...

避开RS485通信的‘坑’:基于STM32和MODBUS协议,详解半双工收发时序与数据紊乱处理

避开RS485通信的‘坑’:基于STM32和MODBUS协议,详解半双工收发时序与数据紊乱处理 在工业自动化、智能家居等场景中,RS485总线因其抗干扰能力强、传输距离远等优势成为多设备通信的首选方案。但许多开发者在实际项目中常遇到数据收发冲突、响…...

观察使用Token Plan套餐前后月度AI调用成本的变化趋势

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 观察使用Token Plan套餐前后月度AI调用成本的变化趋势 对于频繁调用大模型API的开发者或团队而言,成本的可预测性与可控…...

初创团队如何利用 Taotoken 的 Token Plan 有效控制 AI 开发成本

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初创团队如何利用 Taotoken 的 Token Plan 有效控制 AI 开发成本 对于资源有限的初创团队而言,在产品原型开发或内部工…...

AI数字人驱动的矩阵内容生产:2026年技术架构与人效革命

一、背景:为什么2026年矩阵团队开始淘汰真人出镜?2024年之前,短视频矩阵的内容生产模式是这样的:环节传统方式瓶颈写脚本编剧手写1人1天最多写5条拍视频真人出镜拍摄1人1天最多拍3条剪辑剪辑师手动剪1人1天最多剪8条配音真人录音/…...

[Android] 文案设计助手_24.06.25

[Android] 文案设计助手_24.06.25 链接:https://pan.xunlei.com/s/VOszMVvm4BmG5za6Ib11nfGrA1?pwdsg9f# 文案设计助手,助您文案生成、自动写作,模拟手写生成器。免登陆,下载即用,无需会员。...

OpenCV报错解决:cornerSubPix断言失败 src.channels() == 1 的终极

一、 问题现象:令人头秃的 -215 断言错误 在进行相机标定、棋盘格角点提取或 Harris 角点优化时,很多开发者在调用 cv2.cornerSubPix 函数进行亚像素级精确定位时,经常会遇到如下崩溃报错: D:\a\opencv-python\opencv-python\open…...

AArch64虚拟内存系统架构与硬件自动更新机制详解

1. AArch64虚拟内存系统架构概述AArch64是ARMv8及ARMv9架构的64位执行状态,其虚拟内存系统架构(Virtual Memory System Architecture)是现代ARM处理器的核心组成部分。这套系统通过多级页表机制实现虚拟地址到物理地址的转换,为操…...

SuperRDP完整指南:一键解锁Windows远程桌面多用户并发连接限制

SuperRDP完整指南:一键解锁Windows远程桌面多用户并发连接限制 【免费下载链接】SuperRDP Super RDPWrap 项目地址: https://gitcode.com/gh_mirrors/su/SuperRDP SuperRDP是基于RDPWrap技术的智能工具,专为突破Windows系统远程桌面功能限制而设计…...

基于姿态识别的互动健身系统:用烟花激励锻炼

1. 项目概述:当健身遇上烟花秀这个项目最让我兴奋的点在于:它把枯燥的健身动作变成了创造烟花的魔法。想象一下,当你做一个标准的深蹲,屏幕上会绽放出金色烟花;手臂举到完美角度时,紫色烟火会螺旋上升——这…...

别再只调参了!深入pix2pixHD的多尺度鉴别器与实例地图,解决你的图像合成‘塑料感’难题

突破图像合成瓶颈:pix2pixHD多尺度鉴别器与实例地图的实战精要 当你在深夜调试生成对抗网络,屏幕上的合成图像却始终带着难以消除的"塑料感"——表面过于光滑、边缘模糊、纹理缺乏层次。这种挫败感或许正是促使你点开本文的原因。作为GAN领域的…...

独立开发者如何利用Taotoken以更低成本体验全球主流大模型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 独立开发者如何利用Taotoken以更低成本体验全球主流大模型 对于预算有限的独立开发者或个人研究者而言,探索不同的大模…...

go 链表 (标准库实现)

Go 链表简介Go 标准库里没有单链表,只在 container/list 包里提供了双向循环链表。两个核心类型list.List :链表本身,包含哨兵节点和长度 list.Element :链表节点,存数据 前后指针 type Element struct {Value interf…...

Linux 系统编程 文件篇 (二)

[TOC] Linux 系统编程 文件篇 (二) 1 open 函数介绍 1.1 标记位 上一篇的结尾,我们讲到了我们用的打开文件的库函数其实是封装了,这个 open 的系统调用,然后解释了这个 open 函数的 这个标记位,flags 是一个…...

标题:【2026 最全】CTF 零基础入门指南|小白必看,一篇封神!

前言 CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。发展至今,已经成为全球范围网络安全圈流行的竞赛形式,而DEFCON作为CTF赛制的发源地&#xf…...

【2026 最新】Web 安全完整学习指南 红队全套技能栈

0x00 技能栈 依照红队的流程分工,选择适合自己的技能栈发展。 越接近中心的能力点越贴近web技术栈,反之亦然。可以根据自身情况,选择技术栈的发展方向。 0x01 漏洞理解篇(Vulnerability) 1.1 前端 同源策略 & CSP & JOSNP 跨域…...

LabVIEW项目实战:用‘类+队列’模式管理仪器参数,告别全局变量混乱

LabVIEW工程实践:基于类与队列的仪器参数管理框架设计 在工业自动化测试系统中,仪器参数管理一直是困扰工程师的典型难题。当系统需要同时控制网口、串口、GPIB等多种接口的测试设备时,传统的全局变量方案会导致参数耦合、修改不同步等问题。…...

【MATLAB源码-第439期】基于MATLAB的APSK与QAM高阶调制在Saleh非线性功放下BER和EVM性能对比

操作环境:MATLAB 2024a1、算法描述摘要 高阶数字调制技术是现代无线通信和卫星通信系统提高频谱利用率的重要方法。QAM 调制通过同相分量和正交分量的幅度组合形成二维星座,在较高信噪比条件下能够获得较高的信息承载能力。APSK 调制则采用多环幅相结构&…...