本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
昨天,我面试了不少程序员,很多程序员和背书一样。于是后面,我就改变了一下面试技巧。给来的人,一人一台电脑,要求写出个死锁程序,并且使用 jstack 分析出现问题的代码。时间不能超过 1 个半小时。
问题一出,有两个程序员起身要走了,我问为什么?回答:“写不出来”。比较直接,于是我让他们关注了公众号,说明天公布答案。并让人事送他们到了电梯口。
接下来还有一些程序员,拿出手机偷偷的搜索了,我也没说什么。只是结束时说等消息。
只有其中一个老实的程序员很认真,最终写的我很满意。
并且在他的薪资要求上主动给他加了 1K,说多也不多。主要是以后,薪资涨幅不大,5% 到 10 % 的浮动。没有像跳槽这样来的快,给他一个超预期的起点,希望他能在我们公司多待几年。
那么如何写出一个 Java 死锁程序呢?代码很简单,我已写大家就看得明白。
public class DeadLockTest { private static Object lock1 = new Object(); private static Object lock2 = new Object(); public static void main(String[] args) { new Thread(){ @Override public void run() { synchronized (lock1){ System.out.println("Thread1 get lock1"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock2){ System.out.println("Thread1 get lock2"); } System.out.println("Thread1 end"); } } }.start(); new Thread(){ @Override public void run() { synchronized (lock2){ System.out.println("Thread2 get lock2"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (lock1){ System.out.println("Thread2 get lock1"); } System.out.println("Thread2 end"); } } }.start(); } }
代码很简单,就是两个线程分别获取其中一个锁,不释放持有的锁,然后再尝试获取另外一个锁。
然后,我们通过 jps 和 jstack 8902 > jstack_deadlock.log 看一下相关信息。
➜ xttblog jps 8947 Jps 8901 Launcher 1845 1878 RemoteMavenServer 8902 DeadLockTest ➜ xttblog jstack 8902 > jstack_deadlock.log
然后通过我在这篇文章中对线程状态《线程面试必备:线程状态和dump输出状态》的说明。我们看一下,死锁 Deadlock 状态。
"Thread-1" #11 prio=5 os_prio=31 tid=0x00007ffeaec8d000 nid=0x3f03 waiting for monitor entry [0x000070000566e000] java.lang.Thread.State: BLOCKED (on object monitor) at com.dreambrewers.sms.test.DeadLockTest$2.run(DeadLockTest.java:42) - waiting to lock <0x0000000795b518a8> (a java.lang.Object) - locked <0x0000000795b518b8> (a java.lang.Object) "Thread-0" #10 prio=5 os_prio=31 tid=0x00007ffeaec8a000 nid=0x4003 waiting for monitor entry [0x000070000556b000] java.lang.Thread.State: BLOCKED (on object monitor) at com.dreambrewers.sms.test.DeadLockTest$1.run(DeadLockTest.java:24) - waiting to lock <0x0000000795b518b8> (a java.lang.Object) - locked <0x0000000795b518a8> (a java.lang.Object)
从上面可以看出,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 列出的线程的堆栈信息:
Found one Java-level deadlock: ============================= "Thread-1": waiting to lock monitor 0x00007ffeae847ea8 (object 0x0000000795b518a8, a java.lang.Object), which is held by "Thread-0" "Thread-0": waiting to lock monitor 0x00007ffeae845618 (object 0x0000000795b518b8, a java.lang.Object), which is held by "Thread-1" Java stack information for the threads listed above: =================================================== "Thread-1": at com.xttblog.test.DeadLockTest$2.run(DeadLockTest.java:42) - waiting to lock <0x0000000795b518a8> (a java.lang.Object) - locked <0x0000000795b518b8> (a java.lang.Object) "Thread-0": at com.xttblog.test.DeadLockTest$1.run(DeadLockTest.java:24) - waiting to lock <0x0000000795b518b8> (a java.lang.Object) - locked <0x0000000795b518a8> (a java.lang.Object) Found 1 deadlock.
定位到相关的 Java 代码 DeadLockTest.java 第 24 行和 42 行。
最后,你们说这样的程序员,我该不该给他主动上调入职薪资?
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » 只因一个死锁程序和 jstack 分析,我给面试的程序员主动加薪 1 K