死锁

不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁
出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于 阻塞状态,无法继续

解决方法

专门的算法、原则
尽量减少同步资源的定义
尽量避免嵌套同步

  1. public static void main(String[] args) {
  2. StringBuffer s1 = new StringBuffer();
  3. StringBuffer s2 = new StringBuffer();
  4. new Thread(){
  5. @Override
  6. public void run() {
  7. synchronized (s1){//第一道锁
  8. s1.append("a");
  9. s2.append("1");
  10. try {
  11. Thread.sleep(100); //① 此时可能会切换进程,导致死锁:s1锁未释放
  12. } catch (InterruptedException e) {
  13. e.printStackTrace();
  14. }
  15. //
  16. synchronized (s2){//第二道锁 ⑤:s2锁未释放,阻塞
  17. s1.append("b");
  18. s2.append("2");
  19. System.out.println(s1);
  20. System.out.println(s2);
  21. }
  22. }
  23. }
  24. }.start();
  25. //②:主进程继续,进入第二道进程
  26. new Thread(new Runnable() {
  27. @Override
  28. public void run() {
  29. synchronized (s2){//第一道锁:③:此时s2上锁
  30. s1.append("c");
  31. s2.append("3");
  32. synchronized (s1){//第二道锁:④:s1锁未释放,阻塞
  33. s1.append("d");
  34. s2.append("4");
  35. System.out.println(s1);
  36. System.out.println(s2);
  37. }
  38. }
  39. }
  40. }).start();
  41. }