一.线程状态
1.start
..
2.stop
..
3.wait
..
4.notify/notifyAll
..
5.sleep
..
6.interrupt
..
7.join
..
8.yield
..
面试题:
1.sleep是否会释放锁
2.wait是否会释放锁,wait是否必须要要在synchronized的代码块中
3.notify是否会释放锁,何时释放锁
4.wait与notifyAll搭配使用的规范是什么?
5.stop执行是否安全,要如何安全的退出线程
6.wait和sleep的区别
7.线程各个状态是如何切换的(比如调用start()从初始状态->就绪状态 wait() 运行中状态 -> 等待状态)
8.线程1 线程2 线程3 需要按顺序先后执行,如何做到?(join)
二、线程同步
1.synchronized
使用
方法 (静态方法、普通方法)
静态方法:是对class对象加锁,所以任何以这个class对象创建出来的实例,在执行次方法时,都需要竞争锁
普通方法:是对普通对象加锁,所以不同实例,调用此方法时不需要竞争锁
代码块
对某个代码块进行加锁,括号内是同一个对象的都需要竞争锁
原理
方法:在方法前面会添加ACC_SYNCHRONIZED标识符
代码块:在代码块前后会添加 monitor_enter 和 monitor_exit标识符
锁升级的过程
无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁
JVM的优化
1.锁升级
2.适应性自旋锁
3.锁消除
4.锁合并
对象头
/..
volatile
/..
面试题:
1.synchronized用在普通方法和静态方法有什么区别?
2.int 和 Integer类型是否可以作为syn()里面的参数,为什么
3.JVM1.8针对synchronized关键字做了哪些优化
4.synchronized实现的原理是什么
5.volatile的三大特性是什么,他能否保住线程安全
6.双重检查锁中,为何要检查两次,为何要使用volatile关键字
2.Lock
使用
1.公平锁
/..
2.非公平锁
/..
3.读写锁
/..
实现原理
1.CAS
/.. 三大问题,如何解决
2.CLH
/..
3.AQS
/.. 使用了什么设计模式,如何实现可重入,线程同步的原理是什么
面试题:
1.什么时候使用synchronized,什么时候用ReentrantLock
2.synchronized与ReentrantLock是否是可重入的,什么是可重入
3.synchronized实现原理是什么,锁升级过程是什么,jvm做了哪些优化
4.ReentrantLock实现原理是什么
5.ConcurrentHashMap是如何实现线程安全的,如何做到性能最佳,jdk1.8的前后有什么区别
三、阻塞队列