JUC-Lock

什么是JUC

就是jdk為了操作多線程的一個(gè)工具包的簡(jiǎn)稱

image.png

通過代碼對(duì)比Lock和Synchronizied的用法和區(qū)別

Synchronizied

/**
 * @author 小魚
 * @version 1.0
 * @date 2021/3/17 9:37 下午
 *  通過oop編程買票
 *
 *  真正的多線程開發(fā)咱旱,公司中的開發(fā),降低耦合性
 *  線程就是一個(gè)單獨(dú)的資源類须喂,沒有任何的附屬操作
 *  1.屬性    2.方法
 */
public class SaleTicket01 {
    public static void main(String[] args) {
        //創(chuàng)建資源類
        Ticket ticket = new Ticket();
        //總共三個(gè)線程共同操作一個(gè)資源類
        new Thread(()->{
            for (int i = 0; i < 50; i++) {
                ticket.buyTicket();
            }
        },"A").start();
        new Thread(()->{
            for (int i = 0; i < 50; i++) {
                ticket.buyTicket();
            }
        },"B").start();
        new Thread(()->{
            for (int i = 0; i < 50; i++) {
                ticket.buyTicket();
            }
        },"C").start();
    }
}
//資源類:OOP思想沦辙,只需要關(guān)注對(duì)象史侣,不是面向接口編程
class Ticket{
    //屬性:50張票
    private int num=50;
    //方法:同過synchronized實(shí)現(xiàn)同步方法,達(dá)到線程安全。synchronized的本質(zhì)就是:隊(duì)列+鎖
    public synchronized  void buyTicket(){
        if(num>0){
            System.out.println(Thread.currentThread().getName()+"已經(jīng)買了第"+(num--)+"張票!還剩下"+num);
        }
    }
}

Lock

Lock是一個(gè)接口茎匠,最常用的實(shí)現(xiàn)類是ReentrantLock
創(chuàng)建ReentrantLock有兩種方式:非公平鎖和公平鎖

  • 非公平鎖


    非公平鎖.png

這是默認(rèn)的創(chuàng)建方式忘瓦,非公平鎖:就是不公平的搁廓,不是誰先進(jìn)來誰就先執(zhí)行。

  • 公平鎖


    公平鎖.png

公平鎖:就是公平的耕皮,是誰先進(jìn)來誰就先執(zhí)行境蜕。

/**
 * @author 小魚
 * @version 1.0
 * @date 2021/3/17 10:00 下午
 *
 *  通過Lock的方法實(shí)現(xiàn)多線程同步安全買票
 *
 *  Lock三部曲用法:
 *      1定義一個(gè)類變量Lock,
 *      2在try 代碼塊中通過lock.lock();添加鎖,
 *      3在finally代碼塊中解鎖凌停; lock.unlock();
 */
public class SaleTicketByLock02 {
    public static void main(String[] args) {
        //創(chuàng)建資源類
        Ticket2 ticket = new Ticket2();
        //總共三個(gè)線程共同操作一個(gè)資源類
        new Thread(()->{
            for (int i = 0; i < 50; i++) {
                ticket.buyTicket();
            }
        },"A").start();
        new Thread(()->{
            for (int i = 0; i < 50; i++) {
                ticket.buyTicket();
            }
        },"B").start();
        new Thread(()->{
            for (int i = 0; i < 50; i++) {
                ticket.buyTicket();
            }
        },"C").start();
    }
}
class Ticket2{
    //屬性:50張票
    private int num=50;
    Lock lock =new ReentrantLock();
    //方法:通過Lock達(dá)到線程安全粱年。
    public  void buyTicket(){
        //加鎖
        lock.lock();
        try {
            //業(yè)務(wù)代碼
            if(num>0){
                System.out.println(Thread.currentThread().getName()+"已經(jīng)買了第"+(num--)+"張票!還剩下"+num);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //解鎖
            lock.unlock();
        }
    }
}

Lock和Synchronized區(qū)別總結(jié)

1.Lock是接口,synchronized是Java的關(guān)鍵字
2.Lock適合代碼量大的地方使用罚拟,synchronized使用代碼量小的地方使用
3.Lock:可重入鎖台诗,可以調(diào)整是否是公平鎖還是非公平鎖,可以判斷鎖赐俗。synchronized:可重入鎖拉队,非公平鎖,不可中斷
4.Lock:必須手動(dòng)釋放鎖秃励,不然會(huì)造成死鎖氏仗。synchronized:會(huì)主動(dòng)釋放鎖
5.Lock:可以判斷鎖的狀態(tài),是否獲到了鎖夺鲜。synchronized:不能判斷鎖的狀態(tài)
6.Lock:不會(huì)一直等待下去皆尔,因?yàn)閠ryLock()方法。synchronized:可能因?yàn)榫€程1獲取到了鎖(阻塞)币励,線程2一直等待下去

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末慷蠕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子食呻,更是在濱河造成了極大的恐慌流炕,老刑警劉巖澎现,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異每辟,居然都是意外死亡剑辫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門渠欺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妹蔽,“玉大人,你說我怎么就攤上這事挠将「炱瘢” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵舔稀,是天一觀的道長(zhǎng)乳丰。 經(jīng)常有香客問我,道長(zhǎng)内贮,這世上最難降的妖魔是什么产园? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮夜郁,結(jié)果婚禮上淆两,老公的妹妹穿的比我還像新娘。我一直安慰自己拂酣,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布仲义。 她就那樣靜靜地躺著婶熬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪埃撵。 梳的紋絲不亂的頭發(fā)上赵颅,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音暂刘,去河邊找鬼饺谬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛谣拣,可吹牛的內(nèi)容都是我干的募寨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼森缠,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼拔鹰!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贵涵,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤列肢,失蹤者是張志新(化名)和其女友劉穎恰画,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓷马,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拴还,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了欧聘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片片林。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖树瞭,靈堂內(nèi)的尸體忽然破棺而出拇厢,到底是詐尸還是另有隱情,我是刑警寧澤晒喷,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布孝偎,位于F島的核電站,受9級(jí)特大地震影響凉敲,放射性物質(zhì)發(fā)生泄漏衣盾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一爷抓、第九天 我趴在偏房一處隱蔽的房頂上張望势决。 院中可真熱鬧,春花似錦蓝撇、人聲如沸果复。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虽抄。三九已至,卻和暖如春独柑,著一層夾襖步出監(jiān)牢的瞬間迈窟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工忌栅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留车酣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓索绪,卻偏偏與公主長(zhǎng)得像湖员,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子者春,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • ??公平鎖:多個(gè)線程按照申請(qǐng)鎖的順序獲取鎖破衔,類似于隊(duì)列。??非公平鎖:上來直接嘗試占有鎖钱烟,如果嘗試失敗晰筛,再采用類似...
    GIT提交不上閱讀 68評(píng)論 0 0
  • synchronized synchronized作用 原子性:synchronized保證語句塊內(nèi)操作是原子的嫡丙。...
    小波同學(xué)閱讀 764評(píng)論 0 7
  • JUC就是java.util .concurrent工具包的簡(jiǎn)稱。 1 進(jìn)程和線程 1.1 相關(guān)概念 進(jìn)程:一個(gè)程...
    囧白白閱讀 407評(píng)論 0 0
  • 什么是JUC读第? 先看看如何創(chuàng)建普通的線程代碼曙博?通過API了解一下Callable接口和Lock鎖 new Thre...
    _Y1閱讀 572評(píng)論 0 0
  • Catalog 1 線程池原理1.1 ThreadPoolExecutor構(gòu)造器1.2 拒絕策略1.3 線程池工作...
    allen鍋閱讀 255評(píng)論 0 1