订票系统差不多是我们最熟悉的一个关于线程并发的问题,如何做到多个售票窗口同时售票而不会导致将同一张票卖给多个旅客,首先很直观 的一点就是当我们把售票余量的增减弄成一个事务,如此一来在增减票余量的代码执行的时候只能允许一个线程操作也就是出票只能是总部出票,那么一个简易的模型就出来了。
首先所有车票(虚拟票使用票号代替)都存放在总部,在总部只需完成接收售票点的出票请求来完成增减票余量并产生唯一票号分发给售票点,然后各售票点将票卖给旅客(所以这个模型的通俗的理解就是各个售票点代替旅客去售票总部排队申请出票,这样就不会出现同一张票卖给多个旅客),这也就是同步与互斥的一个案例吧。
这里讲解一个使用Java实现这个案例的代码吧
很明显这里各个售票点销售的都是售票总部的票余量,所以各个售票点需要共享票余量这个变量。因而我们可以创建一个售票窗口类
