1. package com.atguigu.java;
    2. /**
    3. * 使用同步代码块解决线程安全问题
    4. *
    5. * 例子:创建三个窗口卖票,总共100张,使用继承Thread类的方式
    6. *
    7. *说明:在继承Thread类创建多线程的方式中,慎用this充当同步监视器,
    8. * 考虑使用当前类充当同步监视器
    9. *
    10. * @author Dxkstart
    11. * @create 2021-05-06 21:24
    12. */
    13. public class WindowTest3 {
    14. public static void main(String[] args) {
    15. Window w1 = new Window();
    16. Window w2 = new Window();
    17. Window w3 = new Window();
    18. w1.start();
    19. w2.start();
    20. w3.start();
    21. }
    22. }
    23. class Window extends Thread {
    24. private static int ticket = 100;//票数
    25. static Object obj = new Object();//锁,要加static才能是唯一的锁
    26. @Override
    27. public void run() {
    28. while(true) {
    29. synchronized (Window.class){
    30. // synchronized(obj) {
    31. //错误的方式:此时的this代表t1,t2,t3三个对象
    32. // synchronized(this) {
    33. if (ticket > 0) {
    34. try {
    35. Thread.sleep(50);
    36. } catch (InterruptedException e) {
    37. e.printStackTrace();
    38. }
    39. System.out.println(getName() + ": 卖票,票号为" + ticket);
    40. ticket--;
    41. } else {
    42. break;
    43. }
    44. }
    45. }
    46. }
    47. }