image.png

    /*
    __
    演示线程的死锁问题:
    *
    1.死锁的理解:不同的线程分别占用对方需要的同步资源不放弃,
    __
    都在等待对方放弃自己需要的同步资源,就形成了线程的死锁。
    *
    2.说明:
    __
    1)出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于则色状态,我发继续
    * 2)我们使用同步时,要避免出现死锁。

    _

    1. package com.atguigu.java2;
    2. /**
    3. * 演示线程的死锁问题:
    4. *
    5. * 1.死锁的理解:不同的线程分别占用对方需要的同步资源不放弃,
    6. * 都在等待对方放弃自己需要的同步资源,就形成了线程的死锁。
    7. *
    8. * 2.说明:
    9. * 1)出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于则色状态,我发继续
    10. * 2)我们使用同步时,要避免出现死锁。
    11. *
    12. * @author Dxkstart
    13. * @create 2021-05-07 19:11
    14. */
    15. public class ThreadTest {
    16. public static void main(String[] args) {
    17. StringBuffer s1 = new StringBuffer();
    18. StringBuffer s2 = new StringBuffer();
    19. //继承法、匿名方式
    20. new Thread(){
    21. @Override
    22. public void run() {
    23. synchronized(s1){
    24. s1.append("a");
    25. s2.append("1");
    26. try {
    27. Thread.sleep(50);
    28. } catch (InterruptedException e) {
    29. e.printStackTrace();
    30. }
    31. synchronized(s2){
    32. s1.append("b");
    33. s2.append("2");
    34. System.out.println(s1);
    35. System.out.println(s2);
    36. }
    37. }
    38. }
    39. }.start();
    40. //实现法、匿名方式
    41. new Thread(new Runnable() {
    42. @Override
    43. public void run() {
    44. synchronized(s2){
    45. s1.append("c");
    46. s2.append("3");
    47. try {
    48. Thread.sleep(50);
    49. } catch (InterruptedException e) {
    50. e.printStackTrace();
    51. }
    52. synchronized(s1){
    53. s1.append("d");
    54. s2.append("4");
    55. System.out.println(s1);
    56. System.out.println(s2);
    57. }
    58. }
    59. }
    60. }).start();
    61. }
    62. }