1、synchronized 的实现原理以及锁优化?
Synchronized是通过对象内部的一个叫做监视器锁(monitor)
monitorenter和monitorexit命令实现
Java早期版本中,synchronized属于重量级锁
Java 6之后Java官方对从JVM层面对synchronized较大优化
锁可以从偏向锁升级到轻量级锁,再升级的重量级锁(不能降级)
第二个线程进来偏向锁没有释放升级为轻量级锁
轻量级锁会自旋,超过一定次数,升级重量级
或者第三个线程进来,轻量级锁升级重量级
2、volatile 的实现原理?
作用:内存可见性
缓存行立即写入内存
,
禁止指令重排
特点:它比synchronized的使用和执行成本会更低,因为它不会引起线程上下文的切换和调度
原理:1)Lock前缀指令会引起处理器缓存回写到内存
2)一个处理器的缓存回写到内存会导致其他处理器的缓存无效
具体如下:
对声明了volatile的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存缓存一致性协议,每个处理器通过嗅探在总线上传播的数据检查会将当前处理器的缓存行设置成无效状态,当处理器对这个数据进行修改操作的时候,会重新从系统内存中把数据读到处理器缓存里
加入内存屏障来禁止指令重排
使用前提:不依赖于上次数据
3、Java 的信号灯?
4、synchronized 在静态方法和普通方法的区别?
静态方法作用的对象是这个类的所有对象,
普通方法作用对象是调用这个方法的实例化对象
5、怎么实现所有线程在等待某个事件的发生才会去执行?
闭锁CountDownLatch
Semaphore
6、CAS?CAS 有什么缺陷,如何解决?
aba 版本号
7、synchronized 和 lock 有什么区别?
lock需要手动释放 可中断,可公平,有读写锁
8、Hashtable 是怎么加锁的 ?
synchronized
9、HashMap 的并发问题?
线程不安全,扩容的时候可能死链,hash冲突的时候可能丢失数据
10、ConcurrenHashMap 介绍?1.8 中为什么要用红黑树?
Segment包含HashEntry数组
Segment是一种可重入锁(ReentrantLock)
实现:segment数量是2的n次方,默认16
每一个segment的容量=每个segment里HashEntry*负载因子
如何放入数据:再散列确保数据分散后放入segment
get方法:不加锁,而是用volatile
1.8更新:没有了segment,横向用Node链表替代,Node被调用取时就synchronize加锁。当没Node底下链表超过8个,将加锁
11、AQS
队列同步器
12、如何检测死锁?怎么预防死锁?
jstack ,超时预防死锁
13、Java 内存模型?
每个线程都有一个私有的本地内存 是一个副本
14、如何保证多线程下 i++ 结果正确?
i++不是原子操作,加锁
15、线程池的种类,区别和使用场景?
16、分析线程池的实现原理和线程的调度过程?
17、线程池如何调优,最大数目如何确认?
18、ThreadLocal原理,用的时候需要注意什么?
Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
调用ThreadLocal的remove函数,手动删除不再需要的ThreadLocal,防止内存泄露
19、CountDownLatch 和 CyclicBarrier 的用法,以及相互之间的差别?
CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以使用reset()方法重置
20、LockSupport工具
21、Condition接口及其实现原理
22、Fork/Join框架的理解
23、分段锁的原理,锁力度减小的思考
24、八种阻塞队列以及各个阻塞队列的特性