前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >我主动给面试者加薪 1K 的死锁面试题和 jstack 分析过程

我主动给面试者加薪 1K 的死锁面试题和 jstack 分析过程

作者头像
业余草
修改2019-03-15 11:22:23
3750
修改2019-03-15 11:22:23
举报
文章被收录于专栏:业余草业余草

昨天,我面试了不少程序员,很多程序员和背书一样。于是后面,我就改变了一下面试技巧。给来的人,一人一台电脑,要求写出个死锁程序,并且使用 jstack 分析出现问题的代码。时间不能超过 1 个半小时。

问题一出,有两个程序员起身要走了,我问为什么?回答:“写不出来”。比较直接,于是我让他们关注了公众号,说明天公布答案。并让人事送他们到了电梯口。

接下来还有一些程序员,拿出手机偷偷的搜索了,我也没说什么。只是结束时说等消息。

只有其中一个老实的程序员很认真,最终写的我很满意。

并且在他的薪资要求上主动给他加了 1K,说多也不多。主要是以后,薪资涨幅不大,5% 到 10 % 的浮动。没有像跳槽这样来的快,给他一个超预期的起点,希望他能在我们公司多待几年。

那么如何写出一个 Java 死锁程序呢?代码很简单,我已写大家就看得明白。

640?wx_fmt=png
640?wx_fmt=png

代码很简单,就是两个线程分别获取其中一个锁,不释放持有的锁,然后再尝试获取另外一个锁。

然后,我们通过 jps 和 jstack 8902 > jstack_deadlock.log 看一下相关信息。

640?wx_fmt=png
640?wx_fmt=png

然后通过我在这篇文章中对线程状态《线程面试必备:线程状态和dump输出状态》的说明。我们看一下,死锁 Deadlock 状态。

640?wx_fmt=png
640?wx_fmt=png

从上面可以看出,Thread-0 锁了 locked <0x0000000795b518a8 内存地址> (a java.lang.Object 锁的对象)。然后,waiting to lock <0x0000000795b518b8> 等待锁定另外一个内存地址,也就是对象。

而 Thread-1 锁了 locked <0x0000000795b518b8 内存地址> (a java.lang.Object 锁的对象)。然后,waiting to lock <0x0000000795b518a8> 等待锁定另外一个内存地址,也就是对象。

而 jstack 也很明确的列出了相关线程的状态 java.lang.Thread.State: BLOCKED (on object monitor)。

再看一下 jstack 列出的线程的堆栈信息:

640?wx_fmt=png
640?wx_fmt=png

定位到相关的 Java 代码 DeadLockTest.java 第 24 行和 42 行。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年03月05日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档