Lock鎖

傳統(tǒng)的Synchronized鎖

線程就是一個(gè)單獨(dú)的資源類横朋,它沒有任何的附屬操作寂祥!
先看不加Synchronized多線程并發(fā)下的買票問題:

public class SaleTicket {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        //并發(fā)墩新,多個(gè)線程操作同一個(gè)資源類倍谜,將類丟入線程崩泡。
        new Thread(()->{
                for (int i = 1; i < 40; i++){
                    ticket.sale();
                }
            },"A").start();

        new Thread(()->{
                for (int i = 1; i < 40; i++){
                    ticket.sale();
                }
            },"B").start();

        new Thread(()->{
                for (int i = 1; i < 40; i++){
                    ticket.sale();
                }
            },"C").start();
    }
}

class Ticket{
    /*票數(shù)*/
    private int number = 30;

    /*買票的方式*/
    public void sale(){
        if (number > 0){
            System.out.println(Thread.currentThread().getName()+"賣出了第"+(number--)+"張禁荒,還剩"+number+"張。");
        }

    }
}

運(yùn)行結(jié)果:

A賣出了第30張角撞,還剩29張呛伴。
A賣出了第29張,還剩28張谒所。
A賣出了第28張热康,還剩27張。
A賣出了第27張劣领,還剩26張姐军。
A賣出了第26張,還剩25張尖淘。
A賣出了第25張奕锌,還剩24張。
A賣出了第24張村生,還剩23張惊暴。
A賣出了第23張,還剩22張趁桃。
A賣出了第22張辽话,還剩21張肄鸽。
A賣出了第21張,還剩20張油啤。
A賣出了第20張典徘,還剩19張。
A賣出了第19張益咬,還剩18張逮诲。
A賣出了第18張,還剩17張础废。
C賣出了第16張汛骂,還剩15張罕模。
C賣出了第15張评腺,還剩14張。
C賣出了第14張淑掌,還剩13張蒿讥。
C賣出了第13張,還剩12張抛腕。
C賣出了第12張芋绸,還剩11張。
C賣出了第11張担敌,還剩10張摔敛。
C賣出了第10張,還剩9張全封。
C賣出了第9張马昙,還剩8張。
C賣出了第8張刹悴,還剩7張行楞。
C賣出了第7張,還剩6張土匀。
C賣出了第6張子房,還剩5張。
C賣出了第5張就轧,還剩4張证杭。
C賣出了第4張,還剩3張妒御。
C賣出了第3張解愤,還剩2張。
C賣出了第2張携丁,還剩1張琢歇。
C賣出了第1張兰怠,還剩0張。
B賣出了第17張李茫,還剩16張揭保。

Process finished with exit code 0

很明顯可以看到,多個(gè)線程操作一個(gè)資源類的時(shí)候魄宏,會(huì)出現(xiàn)搶占的情況秸侣,導(dǎo)致運(yùn)行結(jié)果不是我們想要看到的那樣,所以為保證線程同步安全宠互,傳統(tǒng)方式我們會(huì)在資源類中加入Synchronized鎖以達(dá)到我們保證線程同步安全的目的味榛。

/**
     * synchronized 本質(zhì):隊(duì)列、鎖*/
    public synchronized void sale(){
        if (number > 0){
            System.out.println(Thread.currentThread().getName()+"賣出了第"+(number--)+"張予跌,還剩"+number+"張搏色。");
        }

    }

使用Synchronized鎖后的運(yùn)行結(jié)果:

A賣出了第30張,還剩29張券册。
A賣出了第29張频轿,還剩28張。
A賣出了第28張烁焙,還剩27張航邢。
A賣出了第27張,還剩26張骄蝇。
A賣出了第26張膳殷,還剩25張。
A賣出了第25張九火,還剩24張赚窃。
A賣出了第24張,還剩23張吃既。
A賣出了第23張考榨,還剩22張。
A賣出了第22張鹦倚,還剩21張河质。
A賣出了第21張,還剩20張震叙。
A賣出了第20張掀鹅,還剩19張。
A賣出了第19張媒楼,還剩18張乐尊。
A賣出了第18張,還剩17張划址。
A賣出了第17張扔嵌,還剩16張限府。
A賣出了第16張,還剩15張痢缎。
A賣出了第15張歧寺,還剩14張主儡。
A賣出了第14張挫酿,還剩13張宿稀。
A賣出了第13張,還剩12張嵌洼。
A賣出了第12張案疲,還剩11張。
A賣出了第11張麻养,還剩10張褐啡。
B賣出了第10張,還剩9張回溺。
B賣出了第9張春贸,還剩8張混萝。
B賣出了第8張遗遵,還剩7張。
B賣出了第7張逸嘀,還剩6張车要。
B賣出了第6張,還剩5張崭倘。
B賣出了第5張翼岁,還剩4張。
B賣出了第4張司光,還剩3張琅坡。
B賣出了第3張,還剩2張残家。
B賣出了第2張榆俺,還剩1張。
B賣出了第1張坞淮,還剩0張茴晋。

Process finished with exit code 0

Lock鎖


基本實(shí)現(xiàn)類,常用ReentrantLock可重入鎖



ReentrantLock有兩個(gè)構(gòu)造方法回窘,無參構(gòu)造默認(rèn)非公平鎖诺擅,可以允許插隊(duì);有參構(gòu)造可以傳入一個(gè)Boolean值進(jìn)行判斷啡直,若為true烁涌,則是公平鎖苍碟,不允許插隊(duì),先來的先執(zhí)行撮执!



使用Lock鎖的買票例子:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class SaleTicket02 {
    public static void main(String[] args) {
        Ticket02 ticket = new Ticket02();
        //并發(fā)驰怎,多個(gè)線程操作同一個(gè)資源類,將類丟入線程二打。
        new Thread(()->{
                for (int i = 1; i < 40; i++){
                    ticket.sale();
                }
            },"A").start();

        new Thread(()->{
                for (int i = 1; i < 40; i++){
                    ticket.sale();
                }
            },"B").start();

        new Thread(()->{
                for (int i = 1; i < 40; i++){
                    ticket.sale();
                }
            },"C").start();
    }
}

/**
 * Lock三部曲
 * 1.new ReentrantLock()
 * 2.lock.lock() 加鎖;
 * 3.finally ==> lock.unlock() 解鎖*/
class Ticket02{
    /*票數(shù)*/
    private int number = 30;

    //Lock鎖
    Lock lock = new ReentrantLock();

    /*買票的方式*/
    public void sale(){

        //加鎖
        lock.lock();

        try {
            //業(yè)務(wù)代碼
            if (number > 0){
                System.out.println(Thread.currentThread().getName()+"賣出了第"+(number--)+"張县忌,還剩"+number+"張。");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //解鎖
            lock.unlock();
        }

    }
}

Synchronized與Lock的區(qū)別

  • synchronized 是內(nèi)置的Java關(guān)鍵字继效,Lock 是一個(gè)Java類症杏。
  • synchronized 無法判斷獲取鎖的狀態(tài),Lock 可以判斷是否獲取到了鎖瑞信。
  • synchronized 會(huì)自動(dòng)釋放鎖厉颤,Lock 必須要手動(dòng)釋放鎖,若不釋放鎖凡简,會(huì)死鎖逼友!
  • synchronized 線程A(獲得鎖,阻塞)秤涩,線程B(等待帜乞,一直等待);Lock 不一定會(huì)等待下去筐眷,可以用lock.tryLock()嘗試獲取鎖黎烈。
  • synchronized 默認(rèn)可重入,不可以中斷的匀谣,非公平照棋;Lock 默認(rèn)可重入,可以進(jìn)行判斷鎖武翎,非公平(可以進(jìn)行設(shè)置)烈炭。
  • synchronized 適合鎖少量的代碼同步問題;Lock 適合鎖大量的同步代碼宝恶!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載符隙,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末卑惜,一起剝皮案震驚了整個(gè)濱河市膏执,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌露久,老刑警劉巖更米,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異毫痕,居然都是意外死亡征峦,警方通過查閱死者的電腦和手機(jī)迟几,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栏笆,“玉大人类腮,你說我怎么就攤上這事◎燃樱” “怎么了蚜枢?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)针饥。 經(jīng)常有香客問我厂抽,道長(zhǎng),這世上最難降的妖魔是什么丁眼? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任筷凤,我火速辦了婚禮,結(jié)果婚禮上苞七,老公的妹妹穿的比我還像新娘藐守。我一直安慰自己,他們只是感情好蹂风,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布卢厂。 她就那樣靜靜地躺著,像睡著了一般硫眨。 火紅的嫁衣襯著肌膚如雪足淆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天礁阁,我揣著相機(jī)與錄音,去河邊找鬼族奢。 笑死姥闭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的越走。 我是一名探鬼主播棚品,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼廊敌!你這毒婦竟也來了铜跑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤骡澈,失蹤者是張志新(化名)和其女友劉穎锅纺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肋殴,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡囤锉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年坦弟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片官地。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡酿傍,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驱入,到底是詐尸還是另有隱情赤炒,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布亏较,位于F島的核電站可霎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宴杀。R本人自食惡果不足惜癣朗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望旺罢。 院中可真熱鬧旷余,春花似錦、人聲如沸扁达。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跪解。三九已至炉旷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間叉讥,已是汗流浹背窘行。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留图仓,地道東北人罐盔。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像救崔,于是被迫代替她去往敵國和親惶看。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容