真实的面试场景下,当面试官问到死锁相关的知识点的时候,往往会让你手写一个死锁的案例,一般是考察面试者手写代码的功力。
死锁,指两个或多个线程之间,由于互相持有对方需要的锁,而永久处于阻塞的状态。
public class DeadLock implements Runnable{
int flag=1;
static Object o1=new Object();
static Object o2=new Object();
@Override
public void run() {
System.out.println("flag="+flag);
if(flag==1){
synchronized (o1){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o2){
System.out.println("线程1成功拿到两把锁");
}
}
}
if(flag==0){
synchronized (o2){
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (o1){
System.out.println("线程2成功拿到两把锁");
}
}
}
}
public static void main(String[] args) {
DeadLock d1=new DeadLock();
DeadLock d2=new DeadLock();
d1.flag=1;
d2.flag=0;
Thread t1=new Thread(d1);
Thread t2=new Thread(d2);
t1.start();
t2.start();
}
}
执行结果如下,并没有打印出来线程1或2拿到锁
flag=0
flag=1
如果想具体看一下死锁的情况,需要直接 jstack -pid,我摘取了关键的信息如下:
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x000000001c8d3728 (object 0x000000076b8bd7a8, a java.lang.Object),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x000000001c8d0c88 (object 0x000000076b8bd7b8, a java.lang.Object),
which is held by "Thread-1"
Java stack information for the threads listed above:
===================================================
"Thread-1":
at DeadLock.run(DeadLock.java:36)
- waiting to lock <0x000000076b8bd7a8> (a java.lang.Object)
- locked <0x000000076b8bd7b8> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:748)
"Thread-0":
at DeadLock.run(DeadLock.java:24)
- waiting to lock <0x000000076b8bd7b8> (a java.lang.Object)
- locked <0x000000076b8bd7a8> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.