1.线程有哪些状态
添加主线程和子线程(演示阻塞状态)
2.面试题:线程池的核心参数
核心线程和任务队列都是有上限的,所以都满了话就开始使用救急线程;
救急线程也是有上限的,如果再来新的线程的话就需要拒绝策越;
3. 面试题:sleep和wait的区别
3.1 wait方法调用先要获取对象锁
3.2 wait和sleep的区别
注意:这里不需要等待5000ms,几乎是同时打印
注意:这里需要等待5000ms才会释放对象锁(两条打印时间有5000ms)
5.lock和sycnronized的区别
互斥:只能被一个线程调用,其他都需要等待
同步:多个线程可以同步运行,如果有一个线程需要其他结果配合,这时候就需要等待
锁重入:可以添加多个锁(如DCL双检锁)
**71.lock线程阻塞
公平和非公平演示
注意:这样写如果获取锁失败的话,立即退出而不会进入队列,以至于将内存撑爆。
注意:源码中有两个版本
tryLock(最长响应时间):通过参数去设定具体使用公平锁还是非公平锁
tryLock():总是使用了非公平锁
lock条件变量演示:
lock条件变量演示
唤醒后对比:
6.volatile 能否保证线程安全
volatile能解决可见性和有序性但是解决不了原子性问题
6.1 原子性
76.volatile 可见性
78 79 80.有序性 ** 进行压测
8.悲观锁和乐观锁
注意:使用cas的时候balance需要volatile修饰,因为cas虽然保证原子性,还需要配合使用volatile保证可见性
9. Hashtable和ConcurrentHashMap
Hashtable:
注意:它的容量是质数(质数的hash分散性比较好,不需要二次hash),不是2n次方所以不需要二次hash
concurrentHashMap **87.演示Segment索引计算
注意:这体现了设计模式中的原型模式
1.7和1.8的不同
10.谈一谈 ThreadLocal的理解
**96.97 ThreadLock原理