P6中级聊完,进入P7高级。P7是技术专家级别,面试从\”会用框架\”转向\”理解底层\”——volatile可见性怎么保证?synchronized锁升级过程?JVM的GC算法怎么选择?答得好就是P7 offer,答得浅降到P6。
今天8道题覆盖P7核心考点,每道给出能展开三轮追问的深度。
Q1:volatile怎么保证可见性和禁止指令重排?
可见性:volatile变量写入时直接刷到主内存(不走CPU缓存),读取时直接从主内存读(不读缓存)。所以一个线程改了volatile变量其他线程立即可见。
禁止指令重排:编译器/CPU会重排指令优化性能,但volatile变量前后加内存屏障(Memory Barrier),阻止屏障两侧的指令跨过volatile操作重排。
经典场景:DCL单例——if (instance == null)检查后创建对象。对象初始化分三步(分配内存→构造函数初始化→引用赋值),没有volatile的话2和3可能重排,其他线程拿到未初始化的对象。
追问:volatile能保证原子性吗?不能。volatile int count; count++不是原子的(读→加→写三步,中间可能被其他线程改)。要保证原子性用AtomicInteger(CAS)或加锁。
Q2:synchronized的锁升级过程?
JDK 1.6后synchronized做了重大优化,不再直接上重量级锁。锁升级路径:
无锁 → 偏向锁<





