使用同步代码块解决数据安全问题(比如卖票案例中出现的问题)

在卖票案例中会出现两个问题:

1.多个线程执行同一条语句产生了冲突

2.导致数据出现异常

以上两个问题可以总结为:数据安全问题。

Java提供了解决数据安全的方式:使用同步代码块

public class SellTickets implements Runnable{
    //共有100张票
    private int tickets = 100;
    private Object obj = new Object();

    @Override
    public void run() {
        //票数大于0就买票,并告知是哪个窗口卖的
        //每卖一张后,总票数要减1
        //即使票没了也仍可能有人买票,所以使用死循环
        while (true) {
            //锁多条语句操作共享数据,当线程1运行进入锁时,对外相当于被锁起来,其他线程只能等待线程1运行结束才能进入。
            synchronized (obj) {
                if (tickets > 0) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票");
                    tickets--;
                }
            }
        }
    }
}

运行结果:

 

猜你喜欢

转载自www.cnblogs.com/pxy-1999/p/12803265.html