免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
多線程(二)線程的同步


舉例:創(chuàng)建三個賣票窗口,共有一百張票,完成售票

  1. 問題:賣票的過程中,出現(xiàn)了重票、錯票 --> 出現(xiàn)了線程的安全問題
  2. 問題出現(xiàn)的原因:當某個線程操作車票的過程中,尚未操作完成時,其他線程參與進來,也操作車票
  3. 如何解決:當一個線程在操作ticket的時候,其他線程不能參與進來。直到線程a操作完ticket時,其他線程才可以開始操作ticket
    這種情況即使線程出現(xiàn)的阻塞,也不能改變

在Java中,我們通過同步機制,來解決線程的安全問題

解決方法:

方式一:同步代碼塊

  1. 操作共享數(shù)據(jù)的代碼,即為需要被同步的代碼

  2. 共享數(shù)據(jù):多個線程共同操作的變量。比如:ticket

  3. 同步監(jiān)視器,俗稱鎖。任何一個類的對象都可以成為鎖

      要求:多個線程必須要共用同一把鎖 保證唯一性
    

    補充:在實現(xiàn)Runnable接口創(chuàng)建多線程的方式中,我們可以考慮使用this充當同步監(jiān)視器。但!慎用this充當同步監(jiān)視器
    考慮使用當前類充當同步監(jiān)視器。

方式二:同步方法
如果操作共享數(shù)據(jù)的代碼完整聲明在一個方法中,我們不妨將此方法聲明同步

  總結(jié):1. 同步方法仍然涉及到同步監(jiān)視器,只是不需要我們顯示的聲明
        2. 非靜態(tài)的同步方法,同步監(jiān)視器是:this
           靜態(tài)的同步方法,同步監(jiān)視器是當前類本身

同步的方式,解決了線程的安全問題 但是!操作同步代碼時,只能有一個線程參與,其他線程等待。相當于是一個單線程的過程,效率低。

原則:共用同一把鎖

方式一:同步代碼塊

①Runnable()接口實現(xiàn)的多線程

    @Override
    public void run() {
        while (true) {
            synchronized (this) { //此時的this:唯一的Window2的對象 //方式二 synchronized (obj)
                if (ticket > 0) {
                    System.out.println(Thread.currentThread().getName()   " 賣票 票號為: "   ticket);
                    ticket--;
                } else {
                    break;
                }
            }
        }
    }
}

②繼承方式實現(xiàn)多線程

public void run() {
    while (true) {
        synchronized (Window2.class) { //錯誤的方式:synchronized (this) 這里的this有三個對象 鎖必須共用
            if (ticket > 0) {
                System.out.println(Thread.currentThread().getName()   " 賣票 票號為: "   ticket);
                ticket--;
            } else {
                break;
            }
        }
    }
}

方式二:同步方法

①Runnable()接口實現(xiàn)的多線程

class Window3 implements Runnable {
    private int ticket = 100;
    @Override
    public void run() {
        while (true) {
            show();
            if (ticket < 1){
                break;
            }
        }
    }
    private synchronized void show(){
            if (ticket > 0) {
                System.out.println(Thread.currentThread().getName()   " 賣票 票號為: "   ticket);
                ticket--;
            }
        }
}

②繼承方式實現(xiàn)多線程

class Window extends Thread{
    private static int ticket = 100;
    @Override
    public void run() {
        while (true) {
            show();
            if (ticket < 1){
                break;
            }
        }
    }
    private static synchronized void show(){
        if (ticket > 0) {
            System.out.println(Thread.currentThread().getName()   " 賣票 票號為: "   ticket);
            ticket--;
        }
    }
}
來源:https://www.icode9.com/content-4-870451.html
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Java中繼承thread類與實現(xiàn)Runnable接口的區(qū)別
多線程訪問共享數(shù)據(jù)(1)
Java創(chuàng)建線程的兩個方法
線程安全的誤解: 線程安全并不是否定資源共享
java多線程
【第78題】JAVA高級技術(shù)-多線程12(同步鎖-lock)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服