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

相关推荐
步行cgn27 分钟前
FormHttpMessageConverter 详解:Spring MVC 中表单数据的读写转换器
java·spring·mvc
龙亘川33 分钟前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
金銀銅鐵36 分钟前
[Java] 用 CLI 展示 EnumMap 增删键值对时的内部变化
java·源码·ai编程
程序喵大人38 分钟前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
秋天的怀念_David1 小时前
第二十二夜 · 数字迷雾
java·程序人生·算法
Raas1001 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
niucloud-admin2 小时前
NIUCLOUD PHP SAAS上门家政使用文档:城市管理
java·前端·php
专注仿真2 小时前
线性回归和逻辑回归算法详解
开发语言·人工智能·python·大模型训练·控制算法
霸道流氓气质2 小时前
智能客服组件:分层意图识别、RAG Advisor 与人工转接状态机的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
jimy13 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++