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

相关推荐
echome8881 小时前
Python 装饰器详解:从入门到实战的完整指南
开发语言·python
AMoon丶1 小时前
Golang--多种控制结构详解
java·linux·c语言·开发语言·后端·青少年编程·golang
indexsunny1 小时前
互联网大厂Java面试实战:微服务与Spring Boot在电商场景下的应用解析
java·spring boot·redis·docker·微服务·kubernetes·oauth2
薛定谔之死猫1 小时前
Ruby简单粗暴把图片合成PDF文档
java·pdf·ruby
moxiaoran57531 小时前
Spring Bean线程安全性分析
java·spring
小鸡脚来咯2 小时前
正则表达式考点
java·开发语言·前端
Cg136269159742 小时前
JS-对象-
开发语言·javascript·ecmascript
liuyao_xianhui2 小时前
递归_反转链表_C++
java·开发语言·数据结构·c++·算法·链表·动态规划