Java多线程介绍

线程的概念

线程是指 处理请求的机制 在日常业务开发中,往往会遇到请求太多而一个线程处理不过来,此时我们增加线程的数量即可处理大量请求, 但线程的一味创建也会带来一些问题:

1.系统性能不足: 多线程原本就是将系统多余的算力创建多个线程来减少处理时间. 但过多的线程会导致算力不足从而使系统崩溃

2. 线程间的相互影响: 当多个线程共同工作时可能会发生A线程的结果影响到了B线程的工作导致整个结果都出错

使用多线程所需要注意的问题

1.可见性: 当多个线程处理处理一个数据时, 如A线程将a修改之后,B线程却没有发现a被修改了,又将a修改了一遍, 所以我们需要当一个线程修改完后数据后立即通知给其他线程

2.原子性: 例如执行a++操作时, 是先拿到a的值,再将a+1,然后再将+1后的值赋值给a. 分为这三步. 但线程执行的顺序是随机的(A线程在执行a+1时有可能B线程突然出现执行了a-1). 解决这种问题需要将操作转化成一步就做完中间不能被其他线程插入.

3.有序性: 当线程需要执行的指令很多时, 系统会自动的对这些指令进行顺序上的优化. 而有时候这种优化会导致线程间的冲突.

JMM(Java Memory Model)介绍

JMM是Java为处理线程间的相互影响而设计的一套内存数据处理模型, 其核心在于:

1.所有数据存储在"主内存中", 当线程需要进行数据操作时要先将数据从"主内存"中拿出来.

2.线程拥有自己的"工作内存", 线程将数据从"主内存"中拿出来后存放到自己的"工作内存", 进行处理当结束之后再将数据存回"主内存"中.

利用这种内存机制,我们就可以解决多线程所引起的问题

解决多线程的问题

1.可见性: 当变量被volatile关键字修饰时,所有线程对该变量的读写操作都会直接在"主内存"中进行,而不是从线程的"工作内存"中读取或写入。这样可以避免线程间数据不一致的问题。

2.原子性: 对指令利用synchronized 关键字或者 Lock 锁就能保证原子性,使线程无法"穿插操作"

3.有序性: 利用synchronized关键字修饰代码块,即可使系统不会对修饰的代码块进行重排序,保证线程执行顺序.

相关推荐
青山木20 分钟前
Hot 100 --- 岛屿数量
java·数据结构·算法·leetcode·深度优先·广度优先
柒星栈31 分钟前
PHP 源码怎么加密防破解?三套方案实战指南
开发语言·php·android studio
勉灬之37 分钟前
Next.js + Prisma 跨平台部署踩坑记
开发语言·javascript·ecmascript
程序员-珍38 分钟前
报错下载android sdk失败
android·java
糖果店的幽灵43 分钟前
langgraph分支之 - 动态分支(Dynamic Branch)
java·前端·javascript·人工智能·langgraph
吃饱了得干活1 小时前
亿级订单表分库分表设计,从0到1全流程
java·数据库·面试
这是个栗子1 小时前
前端开发中的常用工具函数(九)
开发语言·javascript·ecmascript·at
蓝创工坊Blue Foundry1 小时前
图片文字提取到 Excel:批量任务如何先定义要交付的字段
运维·服务器·开发语言·数据库·自动化·ocr·excel
会飞的小新1 小时前
C 标准库之 <fenv.h> 详解与深度解析
c语言·开发语言·microsoft
唐青枫1 小时前
Java Spring Security 实战详解:从登录认证到 JWT 权限控制
java