什么是死锁

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

解决方法

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

Code

死锁的demo

  1. public class Main {
  2. public static void main(String[] args) {
  3. StringBuffer s1 = new StringBuffer();
  4. StringBuffer s2 = new StringBuffer();
  5. new Thread() {
  6. @Override
  7. public void run() {
  8. synchronized (s1) {
  9. s1.append("a");
  10. s2.append("1");
  11. try {
  12. sleep(100);
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. }
  16. synchronized (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. new Thread(new Runnable() {
  26. @Override
  27. public void run() {
  28. synchronized (s2) {
  29. s1.append("c");
  30. s2.append("3");
  31. synchronized (s1) {
  32. s1.append("d");
  33. s2.append("4");
  34. System.out.println(s1);
  35. System.out.println(s2);
  36. }
  37. }
  38. }
  39. }).start();
  40. }
  41. }