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

相关推荐
葡萄城技术团队9 分钟前
工业数据可视化:使用活字格 AIcoding + Three.js 构建轻量化三维设备监控大屏
开发语言·javascript·信息可视化
qiaosaifei13 分钟前
JAVA老项目中有大量的类名_编译时报找不到符号错误
java·开发语言
聪明蛋子哟16 分钟前
MCP协议深度落地:如何用Python/Java双语言实现统一的工具调用网关?
java·开发语言·python
文子越来越强27 分钟前
【双因子认证】拦截注解@MFACheck 接入指南(其他微服务如何用)
java
一晌小贪欢37 分钟前
python-第27天:Python面向对象详解
开发语言·python·数据可视化·面向对象·python办公
ZGG0031 小时前
线程池详解:从 7 大参数到生产避坑
java·数据库·后端
迪康Defender1 小时前
公用电脑责任追溯难?迪康端点安全一体化管理系统用户模式详解
java·运维·开发语言·网络·其他·安全
京师20万禁军教头2 小时前
47-常用类-八大包装类(Wrapper Classes)
java
come112342 小时前
剪映零基础教程
java·linux·运维
16月6日-晴2 小时前
Java面向对象——接口
java·开发语言