Java多线程基础

Java 多线程编程:从基础到实战! 多线程编程是 Java 中的一个核心概念,它允许多个线程同时执行任务,从而提高程序的效率和响应性。在现代应用程序中,多线程编程无处不在,尤其是在处理高并发任务时。今天,我们将从基础到实战深入讲解 Java 的多线程编程,帮助你更好地理解和应用它。 阅读详情

目录

同步方式

常用对象

一、volatile变量

二、ThreadLocal

三、Future

四、ExecutorCompletionService

五、Thread

并发容器

一、ConcurrentHashMap

二、CopyOnWriteArrayList

线程池

一、ExecutorService

疑问

基础

一、概念

二、注意点

三、其它


java线程是通过映射到操作系统的原生线程上来实现的,所以线程调度最终还是取决于操作系统,所以阻塞唤醒线程都需要从用户态转换到内核态,可能转换的开销比代码执行的开销还大,所以是重量级的。

 

同步方式

1、将所有可变状态封装在对象内部,并通过对象内置锁对所有访问可变状态的代码路径进行同步。

2、监视器模式:把对象所有可变状态封装起来,并由对象自己的内置锁来保护。

3、委托:如:Collections.synchronizedList(new ArrayList<>());

 

常用对象

一、volatile变量

1、不会将变量上的操作与其它内存操作一起重排序,不会被缓存在寄存器或其它处理器不可见的地方,因此读取volatile类型变量时总放回最新写入的值。

2、只能保证可见性,通常用作简单的状态标识。

 

二、ThreadLocal

1、使线程中的某个值与保存值的对象关联起来,使用某个变量的线程都存有一份独立的副本。

2、线程值保存在Thread对象中。

 

三、Future

1、表示任务的生命周期

2、get方法任务时阻塞的

TimeoutException:超时
InterruptedException:任务被中断
ExecutionException:任务抛出异常会被封装成ExecutionException抛出

3、cancel方法

true:会中断线程停止任务。

false:如果任务还没执行会中断任务,如果任务已经开始执行会让任务执行下去。

 

四、ExecutorCompletionService

1、作用:提交了一组计算任务,得到其中完成了的任务。

 

五、Thread

1、interrupt:中断线程(并不意味着立即停止目标线程正在进行的工作,只是传递了请求中断的消息)

2、isInterrupted:目标线程中断状态

3、静态的interrupted:清除当前线程的中断状态(清除中断状态的唯一办法),并返回它之前的值。

4、sleep()等阻塞方法,发现中断时会提前返回,并会清除中断状态,抛出InterruptedException。

5、join():线程执行join方法后,只有改线程任务执行完后,才会执行接下来的代码。

6、UncaughtExceptionHandler通过这个来捕获运行时异常,只能是execute提交的任务,submit提交的任务不行。

 

六、条件队列

1、内置锁:

wait:会自动释放锁、并挂起当前线程

notify:会从等待的多个线程中选址一个来唤醒

2、显式锁(Condition):await,signal

范例:

synchronized (lock){
while(isfull()){
lock.wait();
}
//dosomething
}

 

并发容器

一、ConcurrentHashMap

1、分段锁

2、size和isEmpty被弱化,如:size方法返回的是一个估计值。

二、CopyOnWriteArrayList

1、每次修改时,都会创建并重新发布一个新的容器副本。

 

线程池

一、ExecutorService

1、shutdown:不再接受新任务,等待已经提交的任务执行完成(包括还未开始执行的任务)

2、shutdownNow:取消所有运行中的任务(不再启动队列中还没开始执行的任务),返回所有已提交但尚未开始的任务。

3、invokeAll:提交一组任务,若超时,还没有完成的任务会被取消;

 

疑问

1、线程栈的地址空间

2、DelayQueue

3、句柄

4、套接字

5、newtaskfor

6、关闭钩子的使用 Runtime.getRuntime().addShutdownHook()

7、通信量

 

基础

一、概念

1、发布:是对象能在当前作用域以外的代码中使用,如其它对象中使用该对象的引用。可能破坏安全性。

2、逸出:不该发布的对象发布了。

3、线程封闭:仅在单线程内访问数据,不需要同步。局部变量和ThreadLocal,但需要确保封闭在线程中的对象不会从线程中逸出。

4、ad-hoc线程

5、对象不可变

  • 对象创建后状态不能修改
  • 对象所有域都是final类型
  • 对象正确创建(this引用没有逸出)

6、安全发布

  • 静态初始化函数中初始化对象引用
  • 对象引用保存在volatile类型域或AtomicReferance对象中
  • 对象引用保存在正确构造对象的final域中
  • 对象引用保存在由锁保护的域中(如:Vector)

 

二、注意点

1、执行时间较长的计算,不要持有锁。(如:网络IO)

2、非volatile类型的long和double变量,JVM允许将64位的读或写操作分解为两个32位的操作。

3、不要在this引用中使构造函数逸出。

4、每个线程都会维护两个执行栈,一个用于Java代码一个用于原生代码,JVM默认情况会生成一个复合栈,约0.5MB;

5、大量独立且同构的任务并发处理时,多线程才能使性能真正的提升。明确任务边界;分析粒度更细的并行性;

6、Socket IO或等待内置锁而阻塞,中断线程只能设置线程的中断状态,别无它用。

7、自旋等待(CPU时钟周期浪费)、休眠(低相应性)、Thread.yield(让出一定时间使另一个线程运行)、条件队列(如:wait)

三、其它

1、安全性

2、原子性:原子变量提供了与volatile相同的内存语义,此外还支持原子的更新操作。

3、内存可见性

4、posix线程

5、每个对象都有一个内置锁

6、重排序:编译器操作顺序重排序,并将数值缓存在寄存器中;CPU处理器特定的缓存中。

7、不希望ExecutorService被暴露出去但不希望其被修改时,可用Executors.unconfigurableExecutorService()将其封装起来

8、notify:需要持有条件队列对象相关联的锁,JVM会从这个条件队列上等待的多个线程中选择一个来唤醒。

 

死锁

原因:两个线程以不同的顺序来获得相同的锁,如果按照相同的顺序来请求锁就不会有死锁的风险。

1、获得锁的同时调用外部方法要小心

2、资源死锁:A线程拿着d1连接要d2连接,B线程拿着d2连接要d1连接。

线程饥饿死锁:有界线程池与相互依赖的任务不能一起使用。饥饿指线程无法访问它所需的资源而不能继续执行时。

3、支持定时的锁

4、活锁:线程不断重复执行相同的操作,而该任务总会失败,加入随机性可防止活锁。

 

性能分析

1、上下文切换:线程所需数据不在cpu缓存中,挂起和恢复的性能开销

2、内存同步(内存栅栏:缓存时效,不能重排序),锁粒度粗化,自旋锁,锁消除。同步会增加共享内存总线上的通信量。

3、缩小锁竞争(快进快出)

4、减少竞争的锁(分段锁)

5、Amdahl定律:减少被串行执行的部分

6、原子变量降低更新热点域的开销,细粒度原子操作,并使用处理器底层并发原语(cas)

 

显示锁

一、ReentrantLock

可中断

可定时

可轮询

可公平

非块结构锁

对于公平锁,可轮训的trylock仍然会插队

二、读写锁ReentrantReadWriteLock

1、允许多个读操作同时进行,但是只允许一个写操作

2、可重入

3、默认是非公平的锁

4、线程持有写锁不能在不释放写锁的情况下获得读锁,反之可以。

5、如果锁由读线程持有,另一个线程请求写锁,那么其他读线程都不能获得读取锁,直到写线程释放写入锁。

三、为什么优先使用内置锁

1、他俩性能一致

2、内置锁有锁消除、锁粗化等优化措施

3、内置锁操作可以与特定栈帧关联起来,排查问题可以有更多信息。

四、Condition

Lock.newCondition

Lock和Condition相当于内置锁和条件队列的关系 ,每个Lock可以有任意数量的Condition。

继承了lock的公平性,对于公平锁,线程会依照FIFO顺序从Condition.await中释放,调用await和signal方法时也必须持有锁对象。

要使用更高级特性,如:使用公平特性、每个锁上对应多个等待线程集时。

五、AQS

用于构建锁和同步器的框架

 

【Java基础】多线程从入门到掌握 一.多线程基础 1.多任务概念 现代操作系统(Windows,macOS,Linux)都可以执行多任务。多任务就是同时运行多个任务,例如: 同时打开ie浏览器/QQ/QQ音乐 CPU执行代码都是一条一条顺序执行的,即使是单核cpu,也可以同时运行多个任务。 因为操作系统执行多任务实际上就是让CPU对多个任务轮流交替执行。 例如,假设我们有语文、数学、英语3门作业要做,每个作业需要30分钟... 阅读详情

相关推荐

tcmalloc(高并发内存池)简化版讲解-项目

高清发不上去,私我发高清,项目完整代码@我。

2201_75352618的博客 910

头歌Educoder——JAVA多线程基础——使用 Callable 和 Future 创建线程

使用 Callable 和 Future 创建线程任务描述相关知识Callable和Future编程要求测试说明实现代码 任务描述 本关任务:通过 Callable 和 Future 来创建线程。 相关知识 从Java1.5版本开始,就提供了 Callable 和 Future 来创建线程,这种方式也是在Java程序员面试中经常会被问到的问题。 上一小节介绍了Thread和Runnable两种方式创建线程,不过这两种方式创建线程都有一个缺陷:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通

赵士杰——成功并非一蹴而就,而是在持之以恒的努力中逐渐实现。 8444

告别手动拖拽!PyQt5/PyQt6 QTableView列宽自适应窗口的三种实战方案(附性能对比)

本文详细介绍了PyQt5/PyQt6中QTableView列宽自适应窗口的三种实战方案,包括Stretch模式、resizeEvent手动计算和ResizeToContents模式,并附有性能对比。帮助开发者解决窗口大小变化时列宽不变的常见问题,提升用户体验和开发效率。

weixin_42538752的博客 233

Educoder–Java高级特性(第四章)- 多线程基础(1)使用线程【笔记+参考代码】

Educoder–Java高级特性(第四章)- 多线程基础(1)使用线程【笔记+参考代码】 第一关 编程要求 请仔细阅读右侧代码,根据方法内的提示,在Begin - End区域内进行代码补充,具体任务如下: 使用继承Thread类的方式创建一个名为 ThreadClassOne 的类,重写的run方法需要实现输出0-10之间的奇数,输出结果如下: 1 3 5 7 9; 使用实现Runnab...

fuhanghang的博客 2万+

(七)独立按键

(七)独立按键

m0_52555663的博客 1718

[Dify实战] [安全合规] 用 Dify 优化安全巡检:从经验驱动到标准闭环-带绑定资源

摘要:企业信息系统安全管理中,安全合规巡检面临标准不统一、整改难追踪等痛点。本文提出基于Dify工具的智能化解决方案,通过自动化工作流实现标准检查清单生成、风险等级标注、整改建议输出及审计记录归档。方案采用结构化Prompt模板和Markdown输出格式,涵盖账号权限、数据安全等核心维度,并提供证据收集建议和闭环管理机制,帮助组织从人工经验驱动转向数据流程驱动的合规管理。配套可导入Dify的工作流文件将随后发布。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 272

JAVA多线程基础

JAVA多线程基础 1.什么是并发原理? 多线程:多线程允许我们“同时”执行多段代码。 线程是并发运行的,线程调度会统一规划CPU时间,将CPU的时间划分为若干片段,然后尽可能的均匀分配给所要并发运行的线程,每个线程在获取CPU时间片段后CPU就会运行它的任务,当时间片段用完后,Cpu会离开并执行获取到CPu时间片的线程,所以,所有线程并非真正的“同时”运行着代码,而是走走停停,这种微观上走走停停,在宏观上感觉是同步进行的现象称为“并发运行”。 2.创建线程Thread 1. 方式一:继承Thread并重写

weixin_47600732的博客 4277

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】Caliper从0到使用

技能大赛样题解析,caliper题目从0到使用

weixin_52865146的博客 2076

『Java多线程』基础之基础

Java基础篇~多线程 线程概念 程序(Program) ​ 程序是指令、数据及其组织形式的描述,也就是存储在磁盘或者其他存储设备中含有指令和数据的文件,是一段静态代码 进程(Process) ​ 进程是受操作系统管理的基本单元,是程序的一次动态执行过程,是系统进行资源分配和调度的基本单位,它对应了从代码加载、执行到执行完毕的整个过程,即进程的创建、运行到消亡的过程。从某种程度上来说,进程是正在运行程序的实例,是一个动态概念 多任务(Multi Task) ​ 在一

像写诗一样优雅地写代码~ 7642

跨应用服务器的自定义 IDoc 传输实战:以 CATSDB 工时为例,打通两套 SAP 系统的数据通道

本文介绍了在企业多SAP系统环境下,使用SAP ALE/IDoc技术实现工时数据跨系统传输的解决方案。文章从技术选型、系统架构到具体配置步骤进行了详细说明,重点阐述了IDoc/ALE在异步传输、全链路追踪和数据重放方面的优势。 文章详细讲解了端到端实施流程,包括Logical System配置、RFC Destination创建、Message Type定义、Segment和Basic Type设计等关键步骤。同时提供了出站封装的ABAP代码示例,强调调用MASTER_IDOC_DISTRIBUTE函数后执

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 173

英飞凌TC3xx--深度手撕HSM安全启动(三)--TC3xx HSM系统架构

TC3xx的HSM内核是一颗32位的ARM Cortex M3,主频可达100MHz,支持对称算法AES128、非对称算法PKC(Public Key Crypto) ECC256、Hash SHA2,以及TRNG(真随机数生成)。

认真搞搞汽车MCU 5746

Java之多线程基础

java多线程基础

zhanghuaiwei 444

OPTEE v4.4.0 qemu_v8环境搭建(支持Hafnium)

一、前提条件 二、拉取代码 三、下载工具链 四、修改代码 五、编译 六、运行

AI-安全-功耗 889

Java 多线程基础

在Java开发中,我们经常会用到多线程来解决一些异步的问题,多线程属于Java的重点与难点,下面我们就一步一步的讲解Java中的多线程。

HappyHeng的博客 734

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java多线程基础

java多线程基础1.线程的相关概念2.线程的启动方式 1.线程的相关概念 进程: 进程就是一个程序或者服务运行的过程在操作系统中的体现,即操作系统中一个独立运行的程序或者服务就是一个进程。 多进程: 现在的操作系统都支持同时运行多个程序或者服务,体现在进程上,就是多个进程可以并行的执行,这称之为操作系统支持多进程。 线程: 一个进程的内部还可以划分出多个并行执行的过程,称之为在进程内部存在线程,线程是操作系统能够进行运算调度的最小单位。 多线程: 一个进程可以存在多个线程,并且这些线程可以并行的执行,这

qq_45903614的博客 326

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java学习基础笔记——多线程基础部分

Java多线程基础知识

jiangnank的博客 1160

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

JAVA多线程基础(详解)

实现Runnable接口比继承Thread类所具有的优势:1):适合多个相同的程序代码的线程去处理同一个资源2):可以避免java中的单继承的限制3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立4):线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类线程同步方法是通过锁来实现,每个对象都有且仅有一个锁,这个锁与一个特定的对象关联,线程一旦获取了对象锁,其他访问该对象的线程就无法再访问该对象的其他非同步方法。

欢迎来到空说的博客 1324

【JAVA】多线程基础

1.多线程基础 ⑴什么是多线程 运行中的exe程序就是一个进程,进程中独立的子任务就是线程 ⑵线程和进程的区别 进程是系统进行资源分配的一个独立单位,线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,一个进程可以包括多个线程 ⑶线程的五大状态 新建 创建线程还没有start 就绪 start但是还没有获取CPU时间片 运行 正在执行 阻塞 比如sleep等...

屎蛋的铲屎官 3940

Java基础之多线程

文章简单介绍了java多线程以及多线程最基本的实现方式

paynezj的博客 973

java多线程理论基础

多线程是指在一个程序中同时执行多个线程(Thread)。线程是执行程序的最小单元,它可以独立运行,并且可以与其他线程并发执行。多线程的主要目的是实现并发执行,提高程序的效率和资源利用率。在多线程编程中,可以将程序划分为多个线程,每个线程独立执行特定的任务。多个线程可以同时执行不同的任务,从而实现并发处理。每个线程都有自己的执行路径和执行状态,可以独立访问程序的共享资源。多线程编程可以提高程序的响应性能、并发处理能力和资源利用率。

weixin_60843873的博客 271

java基础之多线程

线程和进程的区别 多个进程的内部数据和状态都是完全独立的,而

zhangbojun888的专栏 595
上一篇: Java多线程并发工具类
下一篇: Netty体系结构
九号铅笔芯
博客等级 码龄9年 9粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值