-
进程和线程的区别
进程:系统运行的基本单位,包含多个线程
线程:独立运行的最小单位,是进程的实体,多个线程共享同一进程内的系统资源 -
什么是线程上下文切换
当一个线程被剥夺cpu使用权时,切换到另外一个线程执行 -
什么是死锁
死锁指多个线程在执行过程中,因争夺资源造成的一种相互等待的僵局 -
死锁的必要条件
- 互斥条件:同一资源同时
只能
由一个线程读取 - 不可抢占条件:
不能
强行剥夺线程占有的资源 - 请求和保持条件:请求其他资源的
同时
对自己手中的资源保持
不放 - 循环等待条件:在
相互
等待资源的过程中,形成一个闭环
想要预防死锁,只需要破坏其中一个条件即可,银行家算法可以预防死锁
- 互斥条件:同一资源同时
-
Synchrpnized和lock的区别
(1)synchronized是关键字,lock是一个类
(2) synchronized在发生异常时会自动释放锁,lock需要手动释放锁
(3)synchronized是可重入锁、非公平锁、不可中断锁,lock是可重入锁,可中断锁,可以是公平锁 -
sleep()和wait()的区别
- 所在类不同
- sleep()是Thread类的静态方法。
wait()是Object类的方法。
- sleep()是Thread类的静态方法。
- 锁释放不同
- sleep()是不释放锁的。
wait()是释放锁的。
- sleep()是不释放锁的。
- 用途不同
- sleep()常用于一定时间内暂停线程执行。
wait()常用于线程间交互和通信。
- sleep()常用于一定时间内暂停线程执行。
- 用法不同
- sleep()方法睡眠指定时间之后,线程会自动苏醒。
wait()方法被调用后,可以通过notify()或notifyAll()来唤醒wait的线程。
- sleep()方法睡眠指定时间之后,线程会自动苏醒。
- 所在类不同
-
yield() 和 join()区别
- yield()调用后线程进入就绪状态
- A线程中调用B线程的join() ,则B执行完前A进入阻塞状态
-
线程池七大参数
- 核心线程数:线程池中的基本线程数量
- 最大线程数:当阻塞队列满了之后,逐一启动
- 最大线程的存活时间:当阻塞队列的任务执行完后,最大线长的回收时间
- 最大线程的存活时间单位
- 阻塞队列:当核心线程满后,后面来的任务都进入阻塞队列
- 线程工厂:用于生产线程
- 拒绝策略:阻塞队列满后,拒绝任务, 有四种策略
(1)抛异常
(2)丢弃任务不抛异常
(3)打回任务
(4)尝试与最老的线程竞争
篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
需要全套面试笔记及答案【点击此处即可】免费获取
-
Java内存模型
- JMM(Java内存模型 )屏蔽了各种硬件和操作系统的内存访问差异,实现让Java程序在各平台下都能达到
一致
的内存访问效果,它定义了JVM如何将程序中的变量在主存中读取 - 具体定义为:所有变量都存在主存中,主存是线程共享区域;每个线程都有自己
独有
的工作内存,线程想要操作变量必须从主
从中copy变量到自己的工作区,每个线程的工作内存是相互隔离
的 - 由于主存与工作内存之间有读写延迟,且读写
不是
原子性操作,所以会有线程安全问题
- JMM(Java内存模型 )屏蔽了各种硬件和操作系统的内存访问差异,实现让Java程序在各平台下都能达到
-
保证并发安全的三大特性?
- 原子性:一次或多次操作在执行期间
不被
其他线程影响 - 可见性:当一个线程在工作内存修改了变量,其他线程能
立刻
知道 - 有序性:JVM对指令的优化会让指令执行
顺序
改变,有序性是禁止
指令重排
- 原子性:一次或多次操作在执行期间
-
volatile
保证
变量的可见性和有序性,不保证
原子性。使用了 volatile 修饰变量后,在变量修改后会立即同步
到主存中,每次用这个变量前会从主存刷新。- 单例模式双重校验锁变量为什么使用 volatile 修饰? 禁止 JVM 指令重排序,new Object()分为三个步骤:申请内存空间,将内存空间引用赋值给变量,变量初始化。如果不禁止重排序,有可能得到一个未经初始化的变量。
-
线程使用方式
- 继承 Tread 类
- 实现 Runnable 接口
- 实现 Callable 接口:带有返回值
-
ThreadLocal原理
- 原理是为每个线程创建变量副本,不同线程之间不可见,保证线程安全。每个线程内部都维护了一个Map,key为
threadLocal
实例,value为要保存的副本。 - 但是使用ThreadLocal会存在
内存泄露
问题,因为key为弱
引用,而value为强
引用,每次gc时key都会回收
,而value不会被回收
。所以为了解决内存泄漏问题,可以在每次使用完后删除value或者使用static
修饰ThreadLocal,可以随时获取value
ThreadLocal 的经典使用场景是数据库连接和 session 管理等。
- 原理是为每个线程创建变量副本,不同线程之间不可见,保证线程安全。每个线程内部都维护了一个Map,key为