死锁

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
比如,当线程 A 持有独占锁 a,并尝试去获取独占锁 b 的同时,线程 B 持有独占锁 b,并尝试获取独占锁 a 的情况下,就会发生 A B 两个线程由于互相持有对方需要的锁,而发生的阻塞现象,我们称为死锁。
死锁示意图如下所示:
死锁 - 图1
死锁代码:

  1. Object obj1 = new Object();
  2. Object obj2 = new Object();
  3. // 线程1拥有对象1,想要等待获取对象2
  4. new Thread() {
  5. @Override
  6. public void run() {
  7. synchronized (obj1) {
  8. try {
  9. Thread.sleep(1000);
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. synchronized (obj2) {
  14. System.out.println(Thread.currentThread().getName());
  15. }
  16. }
  17. }
  18. }.start();
  19. // 线程2拥有对象2,想要等待获取对象1
  20. new Thread() {
  21. @Override
  22. public void run() {
  23. synchronized (obj2) {
  24. try {
  25. Thread.sleep(1000);
  26. } catch (InterruptedException e) {
  27. e.printStackTrace();
  28. }
  29. synchronized (obj1) {
  30. System.out.println(Thread.currentThread().getName());
  31. }
  32. }
  33. }
  34. }.start();