synchronized无法实现同步

问题遇到的现象和发生背景

售票练习中,发现继承Thread类,多线程售票,synchronized无法实现同步。

问题相关代码,请勿粘贴截图
public class Case1 {
    public static void main(String[] args) {
        //实例化对象
        Awindow awindow1 = new Awindow();
        Awindow awindow2 = new Awindow();
        Awindow awindow3 = new Awindow();
        //启用线程
        awindow1.start();
        awindow3.start();
        awindow2.start();
    }
}
class Awindow extends Thread {
    public static int tickeNum = 100;
    //控制变量,控制run方法
    public boolean loop = true;
    //同步方法,同一时刻只有一个线程来执行该方法
    public synchronized void m() {
        if (tickeNum <= 0) {
            System.out.println("售票结束...");
            loop = false;
            return;
        }
        //休眠
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("窗口" + Thread.currentThread().getName() + "卖出一张票" + "剩余:" + (--tickeNum));
    }
    @Override
    public void run() {
        while (loop) {
            m();
        }
    }
}

运行结果及报错内容

打印结果出现了同时售卖的现象:
窗口Thread-1卖出一张票剩余:98
窗口Thread-2卖出一张票剩余:97
窗口Thread-0卖出一张票剩余:97
窗口Thread-1卖出一张票剩余:97
窗口Thread-0卖出一张票剩余:95

我的解答思路和尝试过的方法

接着我尝试注释掉,休眠语句,重复的现象没有了,但是会出现售票的顺序问题,不是排序的
打印结果:
窗口Thread-0卖出一张票剩余:4
窗口Thread-0卖出一张票剩余:3
窗口Thread-1卖出一张票剩余:16
窗口Thread-2卖出一张票剩余:17
后来我使用了继承Runnable接口,来实现多线程,保留了程序中的休眠语句,却并没有出现多卖,重复卖

```java

```和顺序打乱的现象。

我想要达到的结果

为什么在继承Thread类时会出现synchronized无法实现同步的问题

m方法添加 static 修饰

建议你看下这篇博客synchronized实现线程同步的用法和实现原理