这个代码就是有可能存在问题的代码
复现一下问题:
剩下Test类的代码不变。运行结果如下,(一部分截图)会看到15张票重复了,而且出现了还剩-1张,-2张票。100张票卖完就卖完了,怎么可能出现还剩-1,-2张票,肯定是有问题。这个问题就是多线程的安全问题。
这里的问题就是进了代码走到if判断的时候,睡了10毫秒,这时候cpu切到了另外一个线程,也进了if判断,也有可能睡了10毫秒,然后cpu又可能切回了睡的这个线程,开始执行了,执行完之后,打印了,然后cpu又有可能,切回了另一个睡的线程,然后运行代码。这时候打印的tick就是上一个线程执行过后的tick--的基础上再--。如果当前tick = 1 的时候,进了if判断那么tick-- 就是1,然后再一次就是0,再一次就是-1,再一次就是-2。这种情况就是4个线程都进来了,然后依次睡觉。然后依次醒了。
一个小问题,Thread.sleep()这个方法是抛出异常的。那我们到底是try-catch处理呢,还是在run上继续throws呢? 能不能抛? 接口编译完也是一个类class。 实现接口相等于父类。父类中的run没有抛异常,子类中的run能抛异常吗? 在异常章节说过了,只能抛父类抛的异常的子类,接口中run方法都没有抛异常,子类的run就不能抛异常。只能try。
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
添加我为好友,拉您入交流群!
请使用微信扫一扫!