多线程并发

为什么需要多线程?

  1. 为了合理利用CPU的高性能,平衡CPU,内存,IO设备的差异。

线程不安全的示例

  1. 多个线程对同一个共享数据进行访问而不采取同步操作,那么操作的结果是不一致的。

并发的三要素

  1. 可见性:一个线程对共享变量的修改,另外一个线程能够立刻看到
  2. 有序性:即程序执行的顺序按照代码的先后来执行。
  3. 原子性:即一个操作或者多个操作要么全部执行,要么都不执行。

JAVA怎么解决并发问题的:JMM java内存模型

  1. JMM本质上可以理解为,java内存模型规范了JVM如何提供按需禁用缓存和编译优化的方法。具体来说这些方法包括了volatile,sychronized和final 三个关键字,happens-befor规则
  2. 可见性,有序性,原子性
  3. 原子性:在java中对基本数据类型的变量的读取和赋值操作是原子操作,即这些操作时不可被中断的,要么执行,要么不执行。如果要实现更大范围的原子性操作,可以通过sychronized和lock来实现。由于sychronized和lock能够保证任何一时刻只有一个线程执行该代码,从而保证了原子性
  4. 可见性:java提供了volatile关键字来保证可见性。当一个共享变量被volatile修饰时,它会保证修改的值会立刻被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。普通的共享变量不能保证可见性,因为普通共享变量被修改后,什么时候写入主存中是不确定的,当其他线程去读取的时候,此时主存中可能还是原来的旧值,因此无法保证可见性。
  5. 有序性:JMM是通过happens-befor规则来保证有序性的。

synchronized详解

  1. 一把锁只能同时被一个线程获取,没有获得锁的线程只能等待。每个实例都有自己的锁(this)。sychronized修饰的方法正常执行或者抛出异常都会释放锁。
  2. 对象锁,方法锁,类锁
  3. synchronzied原理分析,加锁和释放锁的原理。Monitorenter和Monitorexit指令,会让对象在执行时 使其锁计数器加1或者减1。每一个对象只与一个锁相关联,而一个锁同时只能被一个线程获取。一个对象在尝试获得与这个对象相关联的锁时,Monitorenter指令会发生如下3钟情况:a.monitor计数器为0,意味着目前还没有被获取,那么这个线程就会立刻获得锁然后锁计数器+1,别的线程想获得锁就要等待。b.如果这个monitor已经拿到锁了,又重入了这把锁,那么锁计数器就会累加,并且随着重入的次数一直累加。c.这把锁已经被别的线程获取了,等待锁释放。
  4. Monitorexit指令:释放对monitor的所有权,释放过程就是将monitor减1,如果减完以后,计数器不是0,代表是重入进来的,当前线程还继续持有这把锁,如果计数器变成0了,则释放锁。
  5. 可重入原理:synchronized先天具有重入性,每个对象拥有一个计数器,当线程获取该对象时,计数器加1,释放锁后计数器减1
  6. happens-befor规则:如果A happens-bofore B,则A的执行结果对B可见,并且A的执行顺序先于B。

线程状态

  1. 新建,运行,阻塞,等待,死亡
  2. 线程使用方式,实现Runable接口,Callable接口,继承Thread
  3. 线程中断,通过调用线程的interrupt()方法来中断线程,interrupt()方法会设置线程中断标记,可以调用interrupted()方法判断线程是否处于中断状态

ReentrantLock

  1. 锁的实现,synchronized是JVM实现的,而ReentrantLock是JDK实现的
  2. 性能,新版本对synchronized进行了很多优化,例如自旋锁等。
  3. 等待可中断,当持有锁的线程长期不释放锁的时候,正在等待的线程可以选择放弃等待。ReentrantLock可中断,synchronized不行。
  4. 公平锁,synchronized是非公平的,ReentrantLock默认是非公平的,也可以是公平的。
  5. 使用选择:除非需要使用ReentrantLock的高级功能,否则优先使用synchronized,因为它是JVM实现的一种锁机制,原生地支持,并且不用担心没有释放锁而导致死锁问题。

线程之间的协作

  1. join(),在线程中调用另一个线程的join()方法,会将当前线程挂起,而不是忙等待,直到目标线程结束。
posted @   吃泡面不喝汤  阅读(93)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示