java多线程问题

/*需求:卖票*/classTicketimplementsRunnable{private/*static*/intnum=100;publicvoidrun(){wh... /*需求:卖票*/class Ticket implements Runnable{ private /*static*/int num = 100; public void run() { while (true) { if(num>0) { System.out.println(Thread.currentThread().getName()+"...sale..."+num--); } } }}class TicketDemo { public static void main(String[] args) { Ticket t = new Ticket(); //创建一个线程任务对象 Thread t1 = new Thread(t); Thread t2 = new Thread(t); Thread t3 = new Thread(t); Thread t4 = new Thread(t); t1.start(); t2.start(); t3.start(); t4.start(); }}为什么会有卖了两次100的情况 求解释 执行权和执行资格还是懂的 也了解负数的情况 但是不理解两次100的情况是什么意思 展开
 我来答
貌似風輕
2018-03-11 · TA获得超过7280个赞
知道大有可为答主
回答量:1672
采纳率:94%
帮助的人:703万
展开全部

这是因为你没有处理并发问题

先说下 num-- ,这个过程也是可以拆分的:

  1. 从内存中取出num的值

  2. num - 1

  3. 将减1后的值重新赋值给num(即放回内存)

下面以一个例子说明,为什么有可能会出现多个100

因为你没有做同步,所以线程t1和t2可能在同一瞬间执行到num--处,假设这刚好是程序开始的时候num还等于100。然后来看刚刚拆解的num--的过程。

t1取出了num的值,t2也同时取出了num的值,因为是同时,所以他们取到的都是100。

然后System.out.println输出的 num--,所以会输出num当前的值(减1前的值),在t1和t2看来 num现在都是100,所以会输出2次100。

接下来t1执行减1操作,并将结果99赋值给num。同时t2也执行减1操作,并将结果99赋值给num。

最终,虽然t1和t2都执行了num--,但是最终num的值却是99,这与预期肯定是不一样的。

这也就是编程中要处理的多线程并发问题。

追问
懂了  谢谢大神
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式