问题遇到的现象和发生背景
售票练习中,发现继承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无法实现同步的问题