版权声明:版权归 爱装逼的文艺小青年所有 https://blog.csdn.net/toyota_rav4/article/details/85208433
在多线程系列文章第一篇中我们讲解到了死锁的概念。
由上图可知,死锁就是多个线程都在等待对方释放自己所需要的锁。 我们知道机器不像我们人这么的谦让,他们都是抢占资源跑任务的。所以“你若不释放,我打死也不会释放。”
下面的例子演示了死锁。
package com.demo3;
public class MyObject implements Runnable {
private Object lock = new Object();
private Object lock2 = new Object();
private Object lock3 = new Object();
@Override
public void run() {
if (Thread.currentThread().getName().equals("A")) {
synchronized (lock) {
try {
System.out.println("线程A拿到lock");
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock2) {
System.out.println("线程A拿到lock2");
}
}
}
if (Thread.currentThread().getName().equals("B")) {
synchronized (lock2) {
try {
System.out.println("线程B拿到lock2");
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock3) {
System.out.println("线程B拿到lock3");
}
}
}
if (Thread.currentThread().getName().equals("C")) {
synchronized (lock3) {
try {
System.out.println("线程C拿到lock3");
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (lock) {
System.out.println("线程C拿到lock");
}
}
}
}
}
package com.demo3;
public class Run {
public static void main(String[] args) {
MyObject myObject = new MyObject();
Thread threadA = new Thread(myObject,"A");
Thread threadB = new Thread(myObject,"B");
Thread threadC = new Thread(myObject,"C");
threadA.start();
threadB.start();
threadC.start();
}
}
运行结果:
线程A拿到lock
线程B拿到lock2
线程C拿到lock3
abc,线程拿到 lock lock2 lock3之后,就再也没有释放锁,来达到交、交换锁,执行后续代码的情况。这也就是死锁。为了进一步验证我们的判断,我们使用terminal命令行来查看:
F:\daydayup\thread-demo>jps
11952 Launcher
1348 Run
8740
7084 Jps
F:\daydayup\thread-demo>jstack -l 1348
2018-12-22 15:19:55
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.31-b07 mixed mode):
......
Java stack information for the threads listed above:
===================================================
"C":
at com.demo3.MyObject.run(MyObject.java:46)
- waiting to lock <0x00000000d732d6c0> (a java.lang.Object)
- locked <0x00000000d732d6e0> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:745)
"A":
at com.demo3.MyObject.run(MyObject.java:20)
- waiting to lock <0x00000000d732d6d0> (a java.lang.Object)
- locked <0x00000000d732d6c0> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:745)
"B":
at com.demo3.MyObject.run(MyObject.java:33)
- waiting to lock <0x00000000d732d6e0> (a java.lang.Object)
- locked <0x00000000d732d6d0> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:745)
Found 1 deadlock.
有输出结果足以验证死锁的产生。我们在日常工作中,应该避免死锁。