Java基础、中级、高级、架构面试资料

只因一个死锁程序和 jstack 分析,我给面试的程序员主动加薪 1 K

JAVA herman 1866浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog2,发送下载链接帮助你免费下载!
本博客日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