多线程并发
为什么需要多线程?
- 为了合理利用CPU的高性能,平衡CPU,内存,IO设备的差异。
线程不安全的示例
- 多个线程对同一个共享数据进行访问而不采取同步操作,那么操作的结果是不一致的。
并发的三要素
- 可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到
- 有序性:即程序执行的顺序按照代码的先后来执行。
- 原子性:即一个操作或者多个操作要么全部执行,要么都不执行。
JAVA怎么解决并发问题的:JMM java内存模型
- JMM本质上可以理解为,java内存模型规范了JVM如何提供按需禁用缓存和编译优化的方法。具体来说这些方法包括了volatile,sychronized和final 三个关键字,happens-befor规则
- 可见性,有序性,原子性
- 原子性:在java中对基本数据类型的变量的读取和赋值操作是原子操作,即这些操作时不可被中断的,要么执行,要么不执行。如果要实现更大范围的原子性操作,可以通过sychronized和lock来实现。由于sychronized和lock能够保证任何一时刻只有一个线程执行该代码,从而保证了原子性
- 可见性:java提供了volatile关键字来保证可见性。当一个共享变量被volatile修饰时,它会保证修改的值会立刻被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。普通的共享变量不能保证可见性,因为普通共享变量被修改后,什么时候写入主存中是不确定的,当其他线程去读取的时候,此时主存中可能还是原来的旧值,因此无法保证可见性。
- 有序性:JMM是通过happens-befor规则来保证有序性的。
synchronized详解
- 一把锁只能同时被一个线程获取,没有获得锁的线程只能等待。每个实例都有自己的锁(this)。sychronized修饰的方法正常执行或者抛出异常都会释放锁。
- 对象锁,方法锁,类锁
- synchronzied原理分析,加锁和释放锁的原理。Monitorenter和Monitorexit指令,会让对象在执行时 使其锁计数器加1或者减1。每一个对象只与一个锁相关联,而一个锁同时只能被一个线程获取。一个对象在尝试获得与这个对象相关联的锁时,Monitorenter指令会发生如下3钟情况:a.monitor计数器为0,意味着目前还没有被获取,那么这个线程就会立刻获得锁然后锁计数器+1,别的线程想获得锁就要等待。b.如果这个monitor已经拿到锁了,又重入了这把锁,那么锁计数器就会累加,并且随着重入的次数一直累加。c.这把锁已经被别的线程获取了,等待锁释放。
- Monitorexit指令:释放对monitor的所有权,释放过程就是将monitor减1,如果减完以后,计数器不是0,代表是重入进来的,当前线程还继续持有这把锁,如果计数器变成0了,则释放锁。
- 可重入原理:synchronized先天具有重入性,每个对象拥有一个计数器,当线程获取该对象时,计数器加1,释放锁后计数器减1
- happens-befor规则:如果A happens-bofore B,则A的执行结果对B可见,并且A的执行顺序先于B。
线程状态
- 新建,运行,阻塞,等待,死亡
- 线程使用方式,实现Runable接口,Callable接口,继承Thread
- 线程中断,通过调用线程的interrupt()方法来中断线程,interrupt()方法会设置线程中断标记,可以调用interrupted()方法判断线程是否处于中断状态
ReentrantLock
- 锁的实现,synchronized是JVM实现的,而ReentrantLock是JDK实现的
- 性能,新版本对synchronized进行了很多优化,例如自旋锁等。
- 等待可中断,当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待。ReentrantLock可中断,synchronized不行。
- 公平锁,synchronized是非公平的,ReentrantLock默认是非公平的,也可以是公平的。
- 使用选择:除非需要使用ReentrantLock的高级功能,否则优先使用synchronized,因为它是JVM实现的一种锁机制,原生地支持,并且不用担心没有释放锁而导致死锁问题。
线程之间的协作
- join(),在线程中调用另一个线程的join()方法,会将当前线程挂起,而不是忙等待,直到目标线程结束。
没有目标的日子都是在摆烂,都是虚度光阴,都是在自我欺骗
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具