转载请注明:https://blog.csdn.net/feather_wch/article/details/131198444
[202306132346]
文章目录
Java并发基本概念
- CPU耗时时间
-
进程是分配资源的基本单位,执行还是靠线程
-
并行和并发是指什么?
- 时间片轮转是什么?
- 高并发编程的意义和好处
- 线程数量的限制取决于哪几个方面?
- ThreadMXBean是什么?
- Thread和Runnable是什么?
- 阻塞和挂起的区别?
- 线程启动有几种方式?
线程状态
- 线程状态有哪些?
- running->ready
- running->blocked
- running->waiting/timedWaiting
- ReentrantLock的lock方法会进入阻塞状态吗?
死锁/活锁
- 死锁是怎么发生的?
- 如何避免死锁?
- 活锁是怎么产生的?
中断和停止
- interrupt、interrupted、isInterrupted区别?
- 线程如何停止?
- 为什么不能使用标志变量结束线程?
- JDK中线程是抢占式还是协作式?
- 线程捕捉到InterruptedException后该怎么处理?
守护线程
- 守护线程是什么?
锁
- 不能给Integer等基本类型包装类加synchronized
- 线程的协作模板
// 等待模板sync(对象){
while(条件不满足){
对象.wait();
}
}
// 通知模板sync(对象){
业务
对象.notify/notifyAll();
}
- notify和notifyAll会释放锁吗?
- yield()对锁有什么影响?有什么用?
- 等待超时和连接池
ThreadLocal
- ThreadLocal是怎么实现的?
- ThreadLocal导致内存泄漏的原因?
- 怎么解决ThreadLocal内存泄露?
- 为什么ThreadLocal的key使用WeakReference?
- ThreadLocal一定是线程安全的吗?
- ThreadLocal和Handler中的内存泄漏有什么关联?
并发工具类
Fork/Join
- Fork/Join是什么?
- ForkJoin的使用
ForkJoinPool pool = new ForkJoinPool();
// 支持泛型
RecursiveTask<Integer> task = new RecursiveTask<Integer>() { @Override protected Integer compute() { if(get() <= 0 ){ return 0; }else{ RecursiveTask<Integer> left; RecursiveTask<Integer> right; return left.join() + right.join(); } } }; pool.invoke(task); // 同步 pool.submit(task); // 异步 pool.execute(task);// 异步 Integer result = task.join(); // 获得结果 // 没有返回值 RecursiveAction action = new RecursiveAction() { @Override protected void compute() { // 计算处理 } };
Semaphore
- Semaphore是什么?注意点
Exchanger
- Exchanger是什么?
- 需要线程执行任务后有返回值怎么办?
锁深入太久
CAS机制
- 有CAS为什么还需要Synchronized?
- volatile适合什么场景?
synchronized
ReentrantLock
线程池
- 为什么需要用线程池?
- 拒绝策略/缺省策略有哪几种?
- 提交任务有哪几种方法?
-
shutdown shutdownNow的作用> 取消剩下任务/取消所有任务,中断当前任务。
-
如何合理配置线程数?
- 核心线程数如何判断
- 页缺失是什么?
- OkHttp线程池中线程数
阻塞队列
自我检查
- notify会释放锁吗?
- 实现一个生产者/消费者模型(wait+notify)