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的情况是什么意思
展开
展开全部
这是因为你没有处理并发问题
先说下 num-- ,这个过程也是可以拆分的:
从内存中取出num的值
num - 1
将减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,这与预期肯定是不一样的。
这也就是编程中要处理的多线程并发问题。
追问
懂了 谢谢大神
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询