fzzf1919 2022-05-07 16:51 采纳率: 50%
浏览 14
已结题

线程同步时,直接创建对象与只用匿名类有什么不同?(语言-java)

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
public class SellTicket {
    public static void main(String[] args) {          
        SellTicket03 sellTicket03 = new SellTicket03();
        new Thread(sellTicket03).start();
        new Thread(sellTicket03).start();
        new Thread(sellTicket03).start();
//        new Thread(new SellTicket03()).start();
//        new Thread(new SellTicket03()).start();
//        new Thread(new SellTicket03()).start();

  }
}
class SellTicket03 implements Runnable{
    private static int ticketNum = 100;
    private boolean loop = true;
    @Override
    public void run() {
        while (loop){
            sell();
        }
    }
    public synchronized void sell(){//同步方法
        if (ticketNum <= 0) {
            System.out.println("余票不足,售票失败");
            loop = false;
            return;
        }
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {

        }
        System.out.println("窗口" + Thread.currentThread().getName() + "售票成功,余票:" + --ticketNum);

    }

}

运行结果及报错内容

直接创建对象

img


使用匿名类

img

我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

1条回答 默认 最新

  • zcl_1991 2022-05-07 17:16
    关注

    直接创建对象与只用匿名内部类 没有任何不同;

    但是你的问题不说匿不匿名的问题,是创建一个对象共享与分别创建3个对象的区别;

    你先要搞清楚 ticketNum 静态变量是共享的, loop 私有变量是只属于一个对象的;
    第一个线程先一步执行到 共享变量ticketNum == 0;改修改的只是它自己的 loop = false,另外2个仍然是 true

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 5月15日
  • 已采纳回答 5月7日
  • 修改了问题 5月7日
  • 修改了问题 5月7日
  • 展开全部

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。