(3)Java并发编程基础篇

Java并发编程-基础篇 1. JVM与线程安全 可见性:当多个线程对一个线程进行操作的时候,其中一个线程修改了变量的值,而其他的线程并不知道该值已经被修改 可见性-synchronized JMM关于synchronized的两条规定: 1、线程解锁前,必须把共享变量的最新值刷新到主内存 2、线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值(注意:加锁与解锁是同一把锁) 可见性-... 阅读详情
乐观锁与悲观锁

乐观锁和悲观锁是在数据库中引入的名词,在java的并发包锁中也有类似的概念所以这边我们也有必要提及以下。

  • 悲观锁

悲观锁指在外界对数据进行修改的时候,它都持悲观的态度,认为数据都会被其他人进行修改,所以在获取、修改记录之前都会对记录进行加锁操作。下面看一个典型的例子:

public void updateAction(Integer id){
## 开启事务
line1 : TablePO tPO= getEntity("select * from table where id = #{id} for update;");
line2 : tPO.setXXX1("");
line3 : tPO.setXXX2("");
line4 : updateEntity("update set xxx1 = #{xxx1} AND xxx2=#{} where id = #{id}");
## 提交事务
}

当多个线程同时调用udpateAction时并同时传入相同的id,只有一个线程会成功执行line1代码,其他的线程将会阻塞,这个是因为同一时间内只能有一个线程能够获取对应记录的锁,直到这个线程成功的提交事务,释放锁之后其他线程才会被唤醒继续执行。

  • 乐观锁

乐观锁相对于悲观锁来说它认为一般情况下不会造成数据的冲突,只有在数据提交更新的时候,才会正式去检测数据是否冲突。具体来说是根据update 影响的行数来判定数据是否冲突。下面看一个典型的例子:

public void updateAction(Integer id){
## 开启事务
line1 : TablePO tPO= getEntity("select ID,VERSION,xxx from table where id = #{id}");
line2 : tPO.setXXX1("");
line3 : tPO.setXXX2("");
line4 : int affectRows = updateEntity("update set xxx1 = #{xxx1} AND version=version+1 where id = #{id} AND version=#{version}");
line5 : if(affectRows != 1 ){
		//.....
		}
## 提交事务

假设线程1 和 线程 2 在t1 时刻同时传入相同的ID,都会成功执行line1 的代码,获取相同的tPO(version=1),t2 时刻线程1 对 tPO进行属性赋值的操作并 根据条件id = #{id} AND version=#{version} 成功执行 line4 的更新操作,将version更改为2,t3 时刻 线程2 也对tPO进行属性的赋值 ,执行line4 时失败了,返回影响行数0,由于对应记录version值已经被线程1 更新为2了。这里就有点类似有CAS的操作了。

注意:

  1. t1 < t2 < t3
  2. 数据库中的update 语句本身就具有原子性,所以不会存在多个线程同时执行upadte 语句时出现数据不一致的问题。
公平锁与非公平锁

根据线程抢占锁的机制将锁分为了公平锁和非公平锁,公平锁指对于先请求锁的线程先获取锁,即先到先得,而非公锁锁没有这样的规定,先请求锁的线程不一定会先获取到锁。需要注意的是在没有公平性需求的情况下,尽量使用非公平锁,因为公平锁会带来一定的性能开销。

独占锁和共享锁

独占锁 任何时候只能有一个线程持有,它是一种悲观锁。共享锁 多个线程能同时持有,它是一种乐观锁。

什么是可重入锁

我们知道当一个线程要获取一个已经被其他线程持有的独占锁时,会被阻塞挂起。那么当一个线程要再次获取已经被它自身线程所持有的锁时会不会被阻塞挂起呢?如果不会那么就称它为可重入锁。

自旋锁

自旋锁指当线程要获取已经被其他线程已经持有的锁时,它并不阻塞挂起,而为进行多次重试获取该锁。自旋锁主要通过消耗CPU的时间来换取线程切换和调度的开销。

Java并发编程基础小结 并发编程的核心问题与解决方案 本文从多线程的必要性、优势入手,深入分析了并发编程需要关注的三大核心问题:安全性问题(如数据竞争)、活跃性问题(如死锁、活锁)以及性能问题(如线程切换开销)。作者通过生动的代码示例和图示,展示了在多线程环境下可能出现的典型问题,并指出JVM中线程与进程的资源分配差异。文章还解释了程序计数器、虚拟机栈等线程私有区域的设计原理,以及如何利用"栈封闭"技术解决线程安全问题。全文为Java开发者提供了对并发编程本质问题的系统性思考框架。 阅读详情

相关推荐

《Java并发编程之美》阅读笔记

简介 最近在阅读《Java并发编程之美》这本书,为了督促自己啃完这本书,计划每读完一章写一篇阅读笔记,供以后参考 笔记列表 第一部分 Java并发编程基础篇 第1章 并发编程线程基础 第2章 并发编程的其他基础知识 第二部分 Java并发编程高级篇 第3章 Java并发包中的ThreadLocalRandom类原理剖析 第4章 Java并发包中原子操作类原理剖析 第5章 J...

weixin_43809177的博客 1699

「Juc并发编程」什么是可重入锁?

可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提锁对象得是同一个对象或者class),不会因为之前已经获取过还没释放而阻塞。 Java中ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。......

frozenpenguin的博客 3040

Java并发编程之美

一、前言 并发编程相比 Java 中其他知识点学习门槛较高,从而导致很多人望而却步。但无论是职场面试,还是高并发/高流量的系统的实现,却都离不开并发编程,于是能够真正掌握并发编程的人成为了市场迫切需求的人才。本书将通过图文结合、通俗易懂的方式帮助大家完成多线程并发编程从入门到实践的飞跃! 本书分为三部分: - 第一部分Java并发编程基础篇主要讲解Java并发编程的基础知识,主要讲解线程有关...

加多的博客 5735

什么是可重入锁(递归锁)

当一个线程已经获得了锁,但在持有锁的代码块中又调用了另一个需要同样锁的方法时,如果使用非可重入锁,线程会因为无法再次获得同一个锁而陷入死锁状态。通过调用lock()方法获取锁,再调用unlock()方法释放锁,可以实现多次获取和释放同一个锁的操作。在存款(deposit)和取款(withdraw)方法中,首先使用lock.lock()获取锁,然后执行相应的操作,最后使用lock.unlock()释放锁。可重入锁(Reentrant Lock),也称为递归锁,是一种支持同一个线程多次获取同一个锁的锁机制。

Li2992673708的博客 4070

Vue3项目实战:集成h265webjs打造高性能Web端H.265播放器

本文详细介绍了如何在Vue3项目中集成h265webjs库,构建高性能的Web端H.265播放器。通过封装播放器管理模块、利用Vue3组合式API优雅管理生命周期,并提供了从环境准备、核心集成到进阶优化的完整实战指南,有效解决了浏览器原生不支持H.265解码的难题,显著降低视频流带宽占用。

weixin_29016833的博客 364

Origin画图——获取论文图中数据

有时候需要已发表论文的图的数据,这里使用Origin软件取值,并且可以实现对图形再次画图。 Step 1. 打开origin软件,点击工具,图形数字化工具。 Step 2. 打开要获取数据的图片。拉动红蓝坐标,与图的坐标轴所贴合。 Step 3. 打开要获取数据的图片。拉动红蓝坐标,与图的坐标轴所贴合。 Step 3. 设置参数横轴起始坐标为300-900,纵轴为1.8-2.6. Step 4. 点击第五个手动取点,取出图中数据点。 Step 5. 依次对原图进行取点。点击项目资源查看图。

qq_42278015的博客 5183

可重入锁介绍、使用

文章目录1、什么是可重入锁?2、可重入锁作用及使用场景?3、在内置锁sychronized和ReentrantLock类之间进行选择 1、什么是可重入锁? 可重入锁,也叫做递归锁,指的是同一线程外层函数获得锁之后 ,内层递归函数仍然可以获取该锁的代码,但不受影响。 可重入锁使用示例 public class SynchronizedSample implements Runnable { ...

梦合九千的博客 2321

通达信源码-金牛暴起

趋势1:=3*SMA((CLOSE-LLV(LOW,27))/(HHV(HIGH,27)-LLV(LOW,27))*100,5,1)-2*SMA(SMA((CLOSE-LLV(LOW,27))/(HHV(HIGH,27)-LLV(LOW,27))*100,5,1),3,1) AND SJTJ,DOTLINE,COLORGRAY;谷:=(((DD-LLV(DD,21))/(HHV(DD,21)-LLV(DD,21)))*(4))*(25);{0,25指高度};

qq_57222058的博客 3525

什么叫可重入锁

可重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。 synchronized 和 ReentrantLock 都是可重入锁。 可重入锁的意义之一在于防止死锁。 废话不多说 直接上源码调试 不知道怎么调试源码的看我之前发的文章 先上下代码哈,注:这篇文章重点讲解锁的重入,有时间再讲AQS个ReentrantLock,先用ReentrantLock为例,他内部维护了一个Sync类 这个Sync又有一个state的变量 这就是可重入的关键 进

u010215318的博客 1万+

从NVLINK到EthLink:GPU互联技术演进全解析(含最新行业趋势)

本文深入解析了从NVLINK到EthLink的GPU互联技术演进,重点剖析了Scale-up与Scale-out两种核心范式。文章详细对比了NVLINK、UALINK及革命性的EthLink技术,后者创新性地将以太网改造为支持Load/Store与RDMA双语义的高性能互联网络,旨在打破封闭生态,实现高性能与开放性的统一。最后,文章提供了技术选型指南并展望了未来以以太网为主导、语义融合的行业趋势。

weixin_29204749的博客 178

STM32与SD卡SPI接口硬件设计:从原理图到调试的完整指南

SPI(串行外设接口)作为一种广泛应用的同步串行通信协议,以其接线简单、驱动成熟的特点,成为连接微控制器与各类外设的经典方案。其工作原理基于主从架构,通过时钟、数据线和片选信号实现全双工通信,在嵌入式系统中具有极高的技术价值,常用于连接传感器、存储设备和显示模块等。在数据存储场景中,SD卡凭借其大容量和便携性成为首选,而通过SPI模式驱动SD卡,则平衡了性能与设计复杂度。本文聚焦于使用Altium Designer进行硬件设计的工程实践,详细解析了STM32微控制器与SD卡通过SPI通信时,电源管理、上拉电

weixin_34101784的博客 555

Java多线程和并发编程实践的学习心得----基础篇3

Java多线程和并发编程实践的学习心得----基础篇3

SunnyAndroider专栏 1286

基于 OptiSystem 的掺铒光纤放大器(EDFA)分析

通过构建 EDFA 仿真模型,系统分析了铒离子掺杂半径、离子浓度、光纤长度及泵浦功率等关键参数对放大器增益和噪声特性的影响规律,为 EDFA 的优化设计提供了理论依据与仿真支撑。继续增大至 9μm,增益趋于稳定(约 19dB)。继续增加至 200mW,增益仅增加 2dB,表明泵浦功率存在阈值效应(约 100mW),超过后增益饱和明显。:作为增益介质,主要参数包括光纤长度(5~50m)、铒离子掺杂半径(1~10μm)、离子浓度(1×10²⁵~5×10²⁵m⁻³)、纤芯半径 2.2μm、数值孔径 0.24。

2501_91855190的博客 2676

JAVA八股文面试必会-基础篇-1.3 并发编程

CPU密集的意思是该任务需要大量的运算,而没有阻塞,CPU一直全速运行CPU密集任务只有在真正的多核CPU上才可能得到加速(通过多线程),而在单核CPU上,无论你开 几个模拟的多线程,该任务都不可能得到加速,因为CPU总的运算能力就那样。

lky20011016的博客 351

Wi-Fi QoS中AIFSN/CWmin/CWmax/TxOP参数是怎样计算的?

802.11e/WMM的EDCA机制通过AIFS、CWmin/CWmax和TxOP三组参数实现业务优先级控制。AIFS决定最短等待时间(AIFS=SIFS+AIFSN×SlotTime),CWmin/CWmax定义退避范围(2^ECW-1),TxOP设置最大占用时长(32µs单位)。默认配置中,语音业务(VO)优先级最高,其AIFSN最小(2)、CW范围最小(3-7)、TxOP适中(1.504ms);视频(VI)次之;普通数据(BE)和后台(BK)优先级最低。调优需根据网络特性调整参数:VoIP可降低AIF

1042484520@qq.com(邮箱) 1746

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项复赛模拟卷1:文末附答案)

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项复赛模拟卷1:文末附答案)

王老师青少年编程 1614

《2026全新 | Java 100 天进阶之路:从零基础到上岗就业,108篇完整学习地图》

摘要:不背八股文,不堆概念。44篇基础 + 64篇进阶(共108篇),100天助你达到Java就业水平,从容面对技术面试。 👉 零基础入门 / 校招社招突击 / 1-3年Java后端提升 / 想系统复盘全栈知识的开发者。

折哥|智能物流与Java实战,副高数据库工程师。深耕出版社物流WMS/OMS(线体/立库/VGA),也分享Java进阶与OMS电商对接。Oracle→PG实战派。相信沉淀可迁移能力,分享通用技术,不藏不虚。 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

《Java工程师成神之路》阿里技术专家之作,囊括Java所有知识点!

好在,很早之前就有一位阿里巴巴的技术专家总结了一份《Java工程师成神之路》,作者按照自己的经验总结了从基础,到高级、底层、架构、进阶、扩展等6个大的章节。很多Java程序员一直希望找到一份完整的学习路径,但是市面上很多书都是专注某一个领域的,没有一份完整的大图,以至于很多程序员很迷茫,不知道自己到底应该从哪里开始学,或者不知道自己学习些什么。这份资料之前在GitHub上,短短几个月时间,收获了15k+的Star数,最近,笔者了解到,该项目有了重大的变化,升级到了v3.0版本。

代码界的扛把子 455

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Java 并发编程基础

Java 并发编程基础,涉及并发与并行的区别、进程与线程的区别、Java 线程基础、共享资源访问控制等内容。

leileiluoluo的博客 2177

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

深入浅出Java并发编程:线程基础

通过本文的学习,我们详细探讨了Java并发编程中的线程基础,包括进程与线程的区别、线程的创建方式线程的生命周期守护线程与用户线程、以及线程优先级与调度策略。掌握这些基础知识是进一步学习并发编程的关键。在实际开发中,理解并正确使用这些概念可以帮助我们构建高效、稳定的多线程应用。然而,并发编程的复杂性远不止于此,后续我们还将深入探讨线程安全、锁机制、线程通信等高级主题。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 1935

并发编程学习【基础篇】

由浅入深地学习JUC,一起每天进步一点!

qq_44654974的博客 872

《Java并发编程的艺术》之 Java并发编程基础

《Java并发编程的艺术》之 Java并发编程基础 文章目录《Java并发编程的艺术》之 Java并发编程基础线程简介什么是线程代码清单4-1 MultiThread.java解析为什么要使用多线程更多的处理器核心更快的响应时间线程优先级代码清单4-2 Priority.java结果注意参数解析线程的状态注意Daemon线程注意注意启动和终止线程构造线程代码清单4-6 Thread.java启动线程注意理解中断代码清单4-7 Interrupted.java过期的suspend()、resume()和sto

weixin_44019182的博客 2496

JAVA并发编程系列之-基础概念篇

让我们更细致且优雅地探讨Java并发编程的基础概念篇章,这一学习之旅将分为三个核心章节,旨在为您的编程技能奠定坚实的基石。

weixin_29336323的博客 732

JUC并发编程-高级篇

JUC并发编程-高级篇:1. JUC并发编程介绍、2. 线程基础知识

LiuYQi的博客 911

Java并发编程基础(一篇入门)

1 并发编程简介 1.1 什么是并发编程 所谓并发编程是指在一台处理器上 “同时” 处理多个任务。并发是在同一实体上的多个事件。多个事件在同一时间间隔发生。 并发编程,从程序设计的角度来说,是希望通过某些机制让计算机可以在一个时间段内,执行多个任务。从计算机 CPU 硬件层面来说,是一个或多个物理 CPU 在多个程序之间多路复用,提高对计算机资源的利用率。从调度算法角度来说,当任务数量多于 CPU 的核数时,并发编程能够通过操作系统的任务调度算法,实现多个任务一起执行。 1.2 并发编程的重要性 对于一个

行者无疆的博客 5854
上一篇: (2)Java并发编程基础篇
下一篇: (4)Java并发编程高级篇-ThreadLocalRandom类
yi博说
博客等级 码龄11年 20粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值