昆仑弟子_面霸
06-25·后端开发·10年+
面试吊打面试官
面试官:说说看,线程死锁怎么排查?我:先确认是不是真死锁面试官:怎么确认?我:用jps查进程 ID,再用jstack抓堆栈日志,然后看日志有没标found deadlock,还会列清楚各线程持有的锁、等待的锁面试官:生产环境不让随便执行 jstack 怎么办?我:用jconsole或者VisualVM连远程进程面试官:查到死锁了怎么定位具体代码?我:堆栈里的类名、方法名、行号,可以直接对应到加锁的代码块面试官:定位到了怎么先解决线上问题?我:重启服务面试官:之后要怎么根治?我:改加锁逻辑,要么统一加锁顺序,要么给锁加超时时间,要么用可中断锁面试官:统一加锁顺序?说说看我:所有线程都先锁 A 再锁 B,就不会出现一个拿 A 等 B、一个拿 B 等 A 的情况面试官:锁加超时时间怎么实现?我:ReentrantLock的tryLock方法,就有入参传最大等待时间即可面试官:可中断锁又是什么?我:还是ReentrantLock的lockInterruptibly方法,抢锁过程能响应中断,不会一直卡死面试官:还有别的排查思路吗?我:还能看业务日志,死锁的时候相关请求都会卡住,链路断在加锁的位置也能辅助定位面试官:平时写代码怎么提前避免死锁?我:尽量减少锁嵌套,锁粒度尽量做小,能不用多锁就不用,真要用就按刚才说的规则来
发布于 广东
14
5
18
未登录
友善发言
image-upload
评论
加载中