一个关于多线程售票的问题,我这属于死锁吗,求解决!!

问题场景,1000瓶水 三个人拿,每人每次拿20瓶,库存少于100瓶则补充,大家看我运行截图,出大问题。
运行结果部分:
比赛1拿走20瓶水,现场馆有水980瓶水
比赛1拿走20瓶水,现场馆有水960瓶水
比赛1拿走20瓶水,现场馆有水940瓶水
比赛1拿走20瓶水,现场馆有水920瓶水
比赛1拿走20瓶水,现场馆有水900瓶水
比赛1拿走20瓶水,现场馆有水880瓶水
比赛1拿走20瓶水,现场馆有水860瓶水
比赛1拿走20瓶水,现场馆有水840瓶水
以下重复
··
一直都是就比赛1这一个线程在搬水,其他线程怎么不动啊!!

import java.lang.constant.Constable;

class Water {
public static int num;

public Water(int num) {
    this.num=num;
}

public int getNum() {
    return num;
}

public void setNum(int num) {
    this.num = num;
}

}

class Game extends Thread{
private Water water;
private String name;
int n;

public Game(Water water, String name, int n) {
    this.water = water;
    this.name = name;
    this.n = n;
}
private static Object object=new Object();

@Override
public void run() {
    synchronized (object) {
        while (water.num > 100) {
            if (water.num > 100) {
                water.num = water.num - n;
                System.out.println(name + "拿走" + n + "瓶水," + "现场馆有水" + water.num + "瓶水");
            }
        }
    }
    try{
        sleep(500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

}

public class Test {
public static void main(String[] args) {
Water water = new Water(1000);
Game game1 = new Game(water, "比赛1", 20);
Game game2 = new Game(water, "比赛2", 20);
Game game3 = new Game(water, "比赛3", 20);
game1.start();
game2.start();
game3.start();
}
}

线程一进来就没出去,肯定都他拿啊 ;没进行线程通信,没切换时间片。
有用采纳一下,有问题问我

class Game extends Thread{
private Water water;
private String name;
int n;

public Game(Water water, String name, int n) {
    this.water = water;
    this.name = name;
    this.n = n;
}
private static Object object=new Object();
 
@Override
public void run() {
    synchronized (object) {
        while (water.num > 100) {
            object.notifyAll();
            if (water.num > 100) {
                water.num = water.num - n;
                System.out.println(name + "拿走" + n + "瓶水," + "现场馆有水" + water.num + "瓶水");
                try {
                    object.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    try{
        sleep(500);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
public class Water {
    public int num;

    public Water(int num) {
        this.num=num;
    }

    public int getNum() {
        return num;
    }

    public void setNum(int num) {
        this.num = num;
    }
}

因为你把线程锁放到while外面去了
那不是一进来直接锁住了
除了线程1一直在循环,另外两个线程都在等锁释放