为了账号安全,请及时绑定邮箱和手机立即绑定

这段java多线程代码有问题吗?

这段java多线程代码有问题吗?

开满天机 2019-04-08 11:18:49
publicclassMain{publicstaticvoidmain(String[]args){MyThreadmt=newMyThread();newThread(mt).start();newThread(mt).start();newThread(mt).start();}}classMyThreadimplementsRunnable{privateintticket=20;publicvoidrun(){for(inti=0;i0){System.out.println("线程:"+Thread.currentThread().getName()+"卖票:ticket"+this.ticket--);}}}}
查看完整描述

2 回答

?
杨魅力

TA贡献1811条经验 获得超6个赞

不知道你想要干什么。不过要是买票,可能下面才是对的。
publicsynchronizedvoidrun()....
                            
查看完整回答
反对 回复 2019-04-08
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

你这个涉及到一个共享变量的问题,ticket变量被三个线程同时访问,就可能导致多个线程读到同样的值,这显然是错误的。而且这只是其中一种情况。更复杂的是--操作并不是原子的,这就会产生另一种情况,如果ticket不是int,而是long,递增/递减是分步进行的,这中间可能另一个线程同时向ticket写值,从而产生更离奇的输出。
所以就要对共享变量进行同步控制,synchronized可以用在方法上,也可以以同步块的方式进行。更简单的上使用java.util.concurrent.atomic.AtomicInteger,它提供原子的递增/递减方法。
而且,在输出的地方也会出问题。因为字符串的拼接也不是原子的,所以肯出现输出混乱的情况。
                            
查看完整回答
反对 回复 2019-04-08
  • 2 回答
  • 0 关注
  • 341 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信