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关键字修饰代码块,即可使系统不会对修饰的代码块进行重排序,保证线程执行顺序.

相关推荐
0x534 分钟前
Java网络编程(二)
java·服务器·网络
zlinear数据采集卡15 分钟前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Flittly29 分钟前
【雕虫大技】Agent 动态 Skill 供应链安全加固(三):输出校验与治理闭环实战
java·spring boot·spring
Poo_Chai29 分钟前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库
瑞码空间36 分钟前
Java 图形界面(GUI)完整知识点手册
java·开发语言·图形界面·swing
树码小子40 分钟前
开启 IDEA 中的断言功能
android·java·intellij-idea
茶本无香1 小时前
Java调用Shell脚本执行SQL数据库操作:从入门到实战
java·sql·shell
小努蛋1 小时前
linux编译openresty异常问题,lua_cjson.c:706:5: 错误: ‘for‘ 循环初始化声明只在 C99 或 C++ 模式下允许
开发语言·lua·openresty
风流 少年1 小时前
Spring AI 2.0:MCP
java·后端·spring