大厂高频面试题-线程系列

线程的生命周期,线程有几种状态

五种状态:创建、就绪、运行、阻塞、停止
阻塞又分三种:

  1. 等待阻塞:运行的线程执行wait方法,释放占用的资源,JVM会把当前线程放入等待池中,进入这个状态是不能自动唤醒的,必须依靠其他线程调用notify或者notifyAll唤醒,wait是object中的方法
  2. 同步阻塞:运行的线程获取对象的同步锁,若该同步锁正在被其他线程占用,则JVM会把该线程放到锁池中
  3. 其他阻塞:运行的线程执行sleep或join方法,或发起IO,JVM会将该线程置为阻塞状态,当sleep状态超时、join等待线程终止,线程会重新就绪,sleep是Thread类方法

sleep()、wait()、join()、yield()的区别

  1. 锁池
    所有竞争同步锁的线程都会到锁池中
  2. 等待池
    当调用wait(),线程会放到等待池,等待池的线程不会竞争同步锁的,只有调用notify和notifyAll才会唤醒。

区别

  1. sleep是Thread类的静态方法,wait是Object类的方法
  2. sleep不会释放锁,wait会释放
  3. sleep不依赖synchronized,但是wait需要依赖synchronized
  4. sleep不需要被唤醒,wait需要
  5. sleep一般用于当前线程休眠,而wait用于多线程之间的通信

yield执行后线程会直接进入就绪状态, 不释放锁,马上释放cpu执行权,当时保留了cpu的执行资格,所以下次cpu调度时还会让这个线程执行。
join, 会释放锁,后线程进入阻塞状态,知道等待的线程结束或者中断线程。wait()也确实释放锁,但是释放的是thread的对象锁

synchronized(obj){
//join不释放锁
thread.join(); 

}

synchronized(thread){
//join释放锁
thread.join(); 
}

ThreadLocal的原理和使用场景

每个Thread对象都有一个ThreadLocalMap类型的成员变量threadLocals,存储本线程所有ThreadLocal变量及其对应值
TheadLocalMap由一个个Entry对象构成
Entry继承自WeekReference<ThreadLocal<?>>,一个Entry由ThreadLocal对象和object构成,Entry 的key是ThreadLocal对象,并且是一个弱引用。当没指向key的强引用后,该key就会被垃圾收集器回收。
当执行set时,ThreadLocal会先获取当前线程对象,然后获取当前线程的ThreadLocalMap对象,再以当前ThreadLocal对象为key,将值存储进去
get过程类似。
由于每一条线程均含有各自私有的ThreadLocalMap容器,这些容器相互独立互不影响,因此不会存在线程安全性问题,从而也无需使用同步机制来保证多条线程访问容器的互斥性。

ThreadLocal内存泄露原因,如何避免

由于ThreadLocalMap的生命周期和Thread一样长,如果没有手动删除对应key就会导致内存泄露。
因此每次调用完ThreadLocal都调用remove清除数据
将ThreadLocal变量定义为private static,这样就一直存在ThreadLocal的强引用,也就能保证任何时候都能通过ThreadLocal弱引用访问到Entry的value值,进而清除掉数据

volatile

  1. 保证被volatile修饰的共享变量对所有线程总是可见的,也就是当一个线程修改了一个被volatile修饰共享变量的值,新值总是可以被其他线程立即得知
  2. 禁止指令重排序优化

线程池中线程复用原理

线程池将线程和任务进行解耦,线程是线程,任务是任务,摆脱了之前通过 Thread 创建线程时的一个线程必须对应一个任务的限制。
在线程池中,同一个线程可以从阻塞队列中不断获取新任务来执行,其核心原理在于线程池对Thread 进行了封装,并不是每次执行任务都会调用 Thread.start() 来创建新线程,而是让每个线程去执行一个“循环任务”,在这个“循环任务”中不停检查是否有任务需要被执行,如果有则直接执行,也就
是调用任务中的 run 方法,将 run 方法当成一个普通的方法执行,通过这种方式只使用固定的线程就将所有任务的 run 方法串联起来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值