程序1的运行结果:
程序1的输出结果居然出了0号和-1号票,缘由就是synchronized放错了位置,程序1将synchronized放在了if语句的后面,当b线程取出2好票之后,此时ticket=1,等下一次a、b、c线程来的时候,ticket=1>0就进入if语句体,这时cpu分给线程的时间片是先b在c后a这样就致使了上面的结果。
程序2的输出结果:
程序2的输出结果看起来并无什么错误,它没有输出0和-1号票,可是它没有实现多个窗口售票的功能,它只有一个窗口在售票,缘由是咱们把锁放错了位置。一旦cpu将时间片分给一个线程,那么这个窗口就必须把全部的票卖完。
鉴于以上两种错误程序致使的结果,笔者建议你们使用同步方法这种方法比较方便。
关于生产者和消费者的问题,请参看“
模拟生产零件系统程序”。