- public class TicketDemo {
- public static void main(String[] args) {
- Ticket t = new Ticket();
- Thread t0 = new Thread(t);
- Thread t1 = new Thread(t);
- t0.setName("窗口一:");
- t1.setName("窗口二:");
- t0.start();
- t1.start();
- }
- }
- class Ticket implements Runnable {
- private int num = 100;
- public void run() {
- while(true) {
- try {
- sell();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- public void sell() throws InterruptedException {
- if(num>0) {
- Thread.sleep(10);
- System.out.println(Thread.currentThread().getName()+"卖票啦,卖票啦"+num--);
- }
- }
- }
复制代码
我知道会产生安全问题,会出现0号票,不安全。但是我在运行的时候突然发现有两个同号的票,这个问题是怎么产生的。
窗口一卖票啦,卖票啦80
窗口二卖票啦,卖票啦80
窗口二卖票啦,卖票啦79
窗口一卖票啦,卖票啦78
窗口二卖票啦,卖票啦77
窗口一卖票啦,卖票啦76
窗口一卖票啦,卖票啦75
为什么会出现两个80号票呢?
是 num--在运行后给num赋值期间出现的问题吗?
如果分开写
System.out.println(Thread.currentThread().getName()+"卖票啦,卖票啦"+num);
num--;这样我知道是两条语句出现问题,
但是System.out.println(Thread.currentThread().getName()+"卖票啦,卖票啦"+num--);这不是一条语句吗为什么还会出现问题。
具体System.out.println(Thread.currentThread().getName()+"卖票啦,卖票啦"+num--);这条语句在多线程期间是怎么出现同号票安全问题的原因的,麻烦给解释下
|
|