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 浏览器时间循环 交互事件和延时事件的 优先级与执行问题
  • ¥15 GD模块安装出错,libgd无法正常安装
  • ¥20 求有缘人帮我把笛卡尔坐标系转换为经纬度 有偿
  • ¥15 vue2中使用计算属性
  • ¥50 远程桌面打开Mastercam、没有许可证、物理机打开正常
  • ¥15 ubuntu安装gdal后java读取tif文件报错
  • ¥15 请问lammps怎么做两种金属连接的原子浓度分布图
  • ¥15 求jacquard数据集
  • ¥15 w10部分软件不能联网
  • ¥15 关于安装hbase的问题(操作系统-windows)