3、多线程
3、多线程
3.1、线程基础知识
线程与进程的区别
并行与并发的区别
单核CPU
多核CPU
形容
总结
创建线程的方式
线程池创建线程代码,一般建议自定义线程池
runnable和callable的区别(补充)
run()和start()的区别(补充)
线程中包含哪些状态

总览
阻塞的情况
等待的情况
总结
如何让线程t1、t2 、t3按顺序执行
notify() 和 notifyAll() 有什么区别
- notify() :只随机唤醒一个wait线程
- notifyAll() :唤醒所有的wait的线程
wait 和 sleep 方法有什么不同
wait释放锁,并且需要先拿到wait对象的锁。
sleep不释放锁
如何停止一个正在运行的线程
①添加退出标记,使线程正常退出,也就是run方法完成后线程终止
此处的volatile,可见性,是为了防止指令重排优化,把!flag 优化成 true。
②使用stop方法强行终止(不推荐,已经废弃)
t.
stop();
③使用interrupt中断线程
3.2、线程中并发安全
Synchronized的底层原理
总结回复,基础+进阶
基础总结
进阶总结
四种锁的对象头中的markword的区别
重量级锁
轻量级锁
偏向锁
JMM内存模型
JMM(Java Memory Model) Java内存模型,定义了
共享内存
中多线程程序读写操作
的行为规范,通过这些规则来规范对内存的读写操作从而保证指令的正确性。
面试题
你了解CAS吗
保证了无锁情况下的原子性
下图是cas的数据交换过程
总共有三个变量。 把B的结果赋值给V的时候,要拿A对比V,相等,才可以把V重新赋值成B,否则就开始自旋。
V 表示原主内存共享变量
A表示某个线程单独的工作内存中的一个原变量
B表示A要修改后的结果。
面试回答
谈谈你对volatile的理解
告诉JIT,volatile罩着的变量不许去优化。以保证线程间的共享变量的可见性。
禁止指令重排序
面试回答
什么是AQS
全称是 Abstract
Q
ueuedS
ynchronizer ,即抽象队列同步器。它是构建锁或者其他同步组件的基础框架
AQS基本工作机制,当一个线程抢到资源了就把state的状态修改为1有锁,然后后续有线程来了,就会去fifo队列中排队等待,直到state为0的时候,就唤醒fifo的第一个元素,也就是第一个线程。
多个线程同时竞争的时候,用的是CAS保证原子性的。
AQS对公平锁和非公平锁都能实现。
面试回答
ReentrantLock的实现原理
面试回答
Synchronized和Lock有什么区别
语法层面
功能层面
下面部分代码提供多条件变量的示例
性能层面
死锁产生的条件是什么
诊断死锁
面试回答
聊一下ConcurrentHashMap
面试回答
出现并发安全问题的原因
Java并发程序有三大特征:
①原子性:
②可见性:
③有序性:
面试问题
3.3、线程池
线程池的核心参数
任务排队排到一定长度,就去创建救急线程外包来处理(外包和正式工干活没有任何区别),正式工不会被开除,但是外包一定时间空闲是要被开除(释放)的;
keepAliveTime是救急线程生存时间不要误会为减去救急线程生存时间
workQueue是阻塞队列
线程池的执行原理
代码示例
线程中有哪些常见的阻塞队列
我们在项目中选LinkedBlockingQueue,因为有俩把锁一个头锁一个尾锁,比如ArrayBlockingQueue一把锁的效率要高
如何确定核心线程数
面试回答
ps:通常Java开发的项目是io密集型项目,很少有CPU密集型的项目
线程池的种类有哪些
1、newFixedThreadPool(固定线程数)
2、newSingleThreadExecutor(单线程线程池)
3、newCachedThreadPool(全是外包线程)
4、ScheduledThreadPoolExecutor(延迟线程)
面试问题
为什么不建议用Executors创建线程池
3.4、使用场景
CountDownLatch、Future
T1线程调用了CountDownLatch的await()等待,必须等count变成0才可以让T1继续执行
T2、T3、T4 分别调用了CountDownLatch的countDown()方法,把count计数减到0,T1就可以继续执行
从DB中导入50w数据到ES
数据汇总
异步调用
如何控制线程的访问数量
你了解ThreadLocal吗
set方法
get/remove方法
ThreadLocal内存泄露问题
面试问题