Java,synchronized实验出现问题

Dylan、 2021-02-02 09:45:52
这是用synchronized售票系统的代码

class SellTicket implements Runnable {
private int ticketNum = 100;
@Override
public void run() {
while(true) {
synchronized (this) {
if (ticketNum == 0)
break;
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "还剩" + ticketNum-- + "张票");
}
}
}
}

主函数这样调用的:

SellTicket st = new SellTicket();
Thread t1 = new Thread(st,"售票口1");
Thread t2 = new Thread(st,"售票口2");
Thread t3 = new Thread(st,"售票口3");
Thread t4 = new Thread(st,"售票口4");
t1.start();
t2.start();
t3.start();
t4.start();

总是出现问题,只有一个售票口在跑,那位大神帮我看看问题出在哪?
...全文
948 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
abc4160201 2021-02-21
  • 打赏
  • 举报
回复
看看 学习学习
YXTS122 2021-02-15
  • 打赏
  • 举报
回复
引用 5 楼 YXTS122 的回复:
原来sleep要放在同步块的外面,多谢了


错了,放外面会报错的
YXTS122 2021-02-14
  • 打赏
  • 举报
回复
原来sleep要放在同步块的外面,多谢了
maradona1984 2021-02-03
  • 打赏
  • 举报
回复

                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
这段代码挪出同步块就好了,你在同步块里sleep,其他线程也拿不到锁的,出了同步块再sleep就好了
kkkkk0lllll 2021-02-03
  • 打赏
  • 举报
回复
while(true)和synchronized 之间加个 sleep试试
qq_39936465 2021-02-03
  • 打赏
  • 举报
回复
引用 楼主 防秃从C++练起 的回复:
这是用synchronized售票系统的代码 总是出现问题,只有一个售票口在跑,那位大神帮我看看问题出在哪?
程序没问题的,试试吧睡眠时间该长1点应该会有效果 Thread.sleep(200);
XBdefined 2021-02-03
  • 打赏
  • 举报
回复
我用你的代码跑了下 有两个窗口在售票... 多试几次

51,411

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧