多线程同步的时候, 如果同步代码嵌套, 使用相同锁, 就有可能出现死锁

    尽量不要嵌套使用

    1. /**
    2. * 死锁的演示
    3. * 如果同步代码嵌套, 使用相同锁, 就有可能出现死锁
    4. *
    5. */
    6. public class Demo05DeadLock {
    7. private static String s1 = "筷子左";
    8. private static String s2 = "筷子右";
    9. /**
    10. * 为了看到死锁效果,请多次执行以下代码或增加sleep毫秒数。
    11. * @param args
    12. */
    13. public static void main(String[] args) {
    14. new Thread() {
    15. @Override
    16. public void run() {
    17. synchronized(s1) {
    18. System.out.println(getName() + "...获取" + s1 + "等待" + s2);
    19. synchronized(s2) {
    20. try {
    21. //为了能大概率看到死锁的效果,添加sleep
    22. Thread.sleep(200);
    23. } catch (InterruptedException e) {
    24. e.printStackTrace();
    25. }
    26. System.out.println(getName() + "...拿到" + s2 + "开吃");
    27. }
    28. }
    29. }
    30. }.start();
    31. new Thread() {
    32. @Override
    33. public void run() {
    34. synchronized(s2) {
    35. System.out.println(getName() + "...获取" + s2 + "等待" + s1);
    36. synchronized(s1) {
    37. try {
    38. Thread.sleep(200);
    39. } catch (InterruptedException e) {
    40. e.printStackTrace();
    41. }
    42. System.out.println(getName() + "...拿到" + s1 + "开吃");
    43. }
    44. }
    45. }
    46. }.start();
    47. }
    48. }

    为了看到死锁效果,请多次执行代码或增加sleep毫秒数。

    image.png