因为,在多线程运行时随机的,当 System.out.println(name+"-----"+num);执行完后,就被另一个线程强到执行权了,这时,num--还没有运行,这时强到执行权的线程,就会执行,这时 System.out.println(name+"-----"+num);执行打印的结果num和上面一个是一样的。这个执行完就执行了num--,这时,num就减一了,这个时候,第一个线程有可能就抢到执行权了,就执行num--,这时就会有一个不会打印出来,这样就就会出现同一张票被卖出多次,而有的票没卖出的结果。
后面一个也可以用这个解释,当一个线程执行打印语句之前执行权被抢了,当它抢到执行权打印时,他后面的早就打印了。
你想要的是一个什么输出结果, 如果是 想要 t1-t5 从100到1的话
那么我建议你去掉static, 或者 你将执行程序和线程分开。
getTicket方法本身没什么问题 主要是你的代码耦合在了一起。
这个是线程并发执行的安全问题。
多线程在访问同一资源时可能会发生,可以用上锁的方法解决。 同步锁
Synchronized