同步買票問題

 * 同步的特色:
 *         前提:
 *             多個線程
 *        解決問題的時候要注意:
 *            多個線程使用的是同一個鎖對象
 * 同步的好處
 *        同步的出現解決了多線程的安全問題。
 * 同步的弊端
 *        當線程至關多時,由於每一個線程都會去判斷同步上的鎖,這是很耗費資源的,無形中會下降程序的運行效率。
 */安全

public class SellTicketDemo {
    public static void main(String[] args) {
        // 建立資源對象
        SellTicket st = new SellTicket();

        // 建立三個線程對象
        Thread t1 = new Thread(st, "窗口1");
        Thread t2 = new Thread(st, "窗口2");
        Thread t3 = new Thread(st, "窗口3");

        // 啓動線程
        t1.start();
        t2.start();
        t3.start();
    }
}

對應的主類多線程

public class SellTicket implements Runnable {

    // 定義100張票
    private int tickets = 100;

    // 定義同一把鎖
    private Object obj = new Object();

    @Override
    public void run() {
        while (true) {
            // t1,t2,t3都能走到這裏
            // 假設t1搶到CPU的執行權,t1就要進來
            // 假設t2搶到CPU的執行權,t2就要進來,發現門是關着的,進不去。因此就等着。
            // 門(開,關)
            synchronized (obj) { // 發現這裏的代碼未來是會被鎖上的,因此t1進來後,就鎖了。(關)
                if (tickets > 0) {
                    try {
                        Thread.sleep(100); // t1就睡眠了
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName()
                            + "正在出售第" + (tickets--) + "張票 ");
                    //窗口1正在出售第100張票
                }
            } //t1就出來可,而後就開門。(開)
        }
    }
}
相關文章
相關標籤/搜索