Java多线程

[复制链接]
发表于 2026-2-27 00:08:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一样平常开发中我们常常必要使用到多线程来充实使用cpu实现高效实行,这此中必要我们多线程的实行和线程安全有充实的相识,本文重要围绕相干标题睁开。
线程的状态集

Java线程有五种状态:

  • 创建(new): 当刚创建线程对象并没有启动线程时
  • 等候(waitting):此时线程处于对象的等候队列中,线程开释CPU,等候被叫醒,此时线程不会被分配CPU,常见于Object.wait(), Thread.join()方法调用后。
  • 壅闭(blocked):此时线程由于没有得到对象同步锁而进入同队伍列中,等候其他线程开释对象锁。常常是当一个线程从等候队列中被叫醒后,由于由于没有得到锁而进入壅闭状态。
  • 运行(running):线程在此状态下开始运行大概等候CPU实行
  • 竣事(terminated): 线程竣事

线程安全

线程安满是指多线程访问时,包管操纵的可见性、有序性、原子性。之以是有会存在不安全的情况,是由于线程的工作模子是基于工作内存+主内存布局。

上述主内存可以大抵明白为堆内存/磁盘,工作内存可以大抵明白为假造机栈相干内存大概寄存器/高速缓存,Java线程实行时,先从主内存将共享数据拷贝到工作内存(线程私有),然后实行相干指令。那么各线程在工作内存操纵数据时就会出现和主内存差别等的情况,导致出现希奇的结果。
那么怎样实现线程安全呢?
volatile变量

volatile变量有以下两条语义:

  • 包管此变量对全部变量可见,即其他线程修改变量之后,当火线程可以立即得知。但是其并不能包管操纵的原子性,即如果操纵不是原子性的,那么仍旧不是线程安全的。
  • 插入同步栅栏,包管栅栏前后的指令在实行优化时不会重排序。
synchronized

synchronized基于互斥同步来包管可见性、原子性、有序性。即通过在字节码中插入moniterenter和moniterexit指令来使得只有得到了对象锁的线程才华实行当前代码块,而其他线程则必须等候当前锁开释后才华实行。
ReentrantLock

ReentrantLock是java并发包提供的线程安全工具类,其相比synchronized有以下上风

  • 其等候可以被停止
  • 公平锁:当多个线程在等候同一个锁时,必须按照申请时间序次来依次得到锁
  • 能在一个ReentrantLock对象上绑定多个Condition对象,能和多个条件关联。、
ReentrantLock其原理是AQS+CAS实现,CAS接纳硬件包管操纵的原子性,即先比力地点上变量的值是否满足预期,满足预期再将其更改为新的值。而在ReentrantLock中满足预期则表现当火线程拿到了锁,如果不满足,则将对象到场AQS队列,当其他线程开释开释后,再从AQS队列中取出等候对象,再次实行CAS。
线程模子

Java假造机屏蔽了各操纵体系及其硬件层的差异,使得一套代码可以无缝在多个平台上运行,那么对于Java中的Thread与操纵体系的线程的映射关系是怎样的呢?
我们通例使用的Sun JDK的Window和Linux版本中都是使用一对一的线程模子来实现Java线程的,即一个Java Thread映射到一条轻量级进程中。
常见线程口试标题


  • 谈谈你对AQS的明白lock和synchronized 区别
  • 线程池怎样知道一个线程的任务已经实行完成什么叫做壅闭队列的有界和无界
  • lock和Synchronized 区别
  • 讲一下wait和notify这个为什么要在synchronized 代码块中?你是怎么明白线程安全标题的?
  • 什么是保卫线程,它有什么特点谈谈你对AQS的明白
  • AbstractQueuedSynchronized为什么接纳双向链 表lock和synchronized 区别
  • 线程池怎样知道一个线程的任务已经实行完成什么
  • ConcurrentHashMap底层详细实现知道吗?实现原 理是什么?能谈一下CAS机制吗?
  • 死锁的发生缘故原由和怎么克制
  • volatile关键字有什么用?它的实现原理是什么?
  • 请说一下ReentrantLock的实现原理?
  • 基于数组的壅闭队列ArrayBlockingQueue原理怎么 明白线程安全?
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表