weixin_58770079 2022-08-10 12:15 采纳率: 100%
浏览 28
已结题

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无法实现同步的问题

  • 写回答

2条回答 默认 最新

  • idiot_qi 2022-08-10 12:44
    关注

    m方法添加 static 修饰

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月18日
  • 已采纳回答 8月10日
  • 创建了问题 8月10日

悬赏问题

  • ¥15 2024-五一综合模拟赛
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭