什么是线程和进程?
程序一个执行过程就是进程,一个进程多个线程,线程是cpu的最小执行单位
为什么要使⽤多线程呢?
提高CPU的利用率 提高效率
使⽤多线程可能带来什么问题?
死锁问题、cpu线程切换消耗问题、内存泄漏问题
说说线程的⽣命周期和状态?
新建状态、就绪状态、运行状态、阻塞状态、死亡状态
什么是线程死锁?如何避免死锁?
多个线程互相持续对方的锁对象 互斥、不可剥夺、循环、请求和保持
说说 sleep() ⽅法和 wait() ⽅法区别和共同点?
相同:都是使线程阻塞
区别:sleep自动唤醒、不会释放锁,wait不会自动唤醒,释放当前持有的锁
为什么我们调⽤ start() ⽅法时会执⾏ run() ⽅法,为什么我们不能直接调⽤ run() ⽅法?
start是多线程的方法,run是对象普通方法
说⼀说⾃⼰对于 synchronized 关键字的了解
锁,保证被它修饰的代码或者方法同时只被一个线程执行,早期是调用操作系统的mutexlock互斥锁实现,java1.6之后优化了(锁升级)
说说⾃⼰是怎么使⽤ synchronized 关键字,在项⽬中⽤到了吗
修饰静态方法,获取的是类的锁,修饰普通方法,获取的是实例对象的锁,修饰代码块,获取的是指定对象的锁。
讲⼀下 synchronized 关键字的底层原理
线程获取monitor的持有权来实现
说说 JDK1.6 之后的synchronized 关键字底层做了哪些优化,可以详细介绍⼀下这些优化吗
todo // 锁升级
谈谈 synchronized和ReentrantLock 的区别
synchronized是jvm的锁,非公平锁,ReentrantLock是JDK提供的,需要手动lock、unlock,还有一些高级功能,公平
todo // ReentrantLock condition选择性通知
讲⼀下Java内存模型
todo // 总结
并发编程的三个重要特性
原子性、可见性、有序性
说说 synchronized 关键字和 volatile 关键字的区别
synchronized主要解决原子性,volatile主要解决可见性和有序性
ThreadLocal
主要保存线程私有的问题
ThreadLocal内存泄露问题
为什么要⽤线程池?
提高CPU利用率
实现Runnable接⼝和Callable接⼝的区别 执⾏execute()⽅法和submit()⽅法的区别是什么呢?
Runnable无返回值 不会抛出错误,Callable有返回值 会抛出错误,execute()无返回值,submit()有返回值
如何创建线程池
ThreadPoolExecutor 或者 ExecutorService 创建
线程池原理分析
介绍⼀下Atomic 原⼦类
- JUC 包中的原⼦类是哪4类?
- 讲讲 AtomicInteger 的使⽤
- 能不能给我简单介绍⼀下 AtomicInteger 类的原理
2.3.16 AQS
- AQS 介绍
- AQS 原理分析
AQS 原理概览
AQS 对资源的共享⽅式
AQS底层使⽤了模板⽅法模式 - AQS 组件总结