最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java并發(fā)系列之JUC中的Lock鎖與synchronized同步代碼塊問題

 更新時間:2022年04月11日 10:16:33   作者:CodeWhite7  
這篇文章主要介紹了Java并發(fā)系列之JUC中的Lock鎖與synchronized同步代碼塊,簡單介紹了lock鎖及鎖的底層知識,結合案例給大家介紹的非常詳細,需要的朋友可以參考下

寫在前邊: 在Java服務端中,會常常遇到并發(fā)的場景,以下我使用兩個售票的案例實現(xiàn)傳統(tǒng)的Lock鎖與synchronized加鎖解決線程安全問題。

本章代碼:Gitee: juc.demo

一、Lock鎖

  • ReentrantLock類: 可重用鎖(公平鎖|非公平鎖)
  • ReentrantReadWriteLock.ReadLock:讀鎖
  • ReentrantReadWriteLock.WriteLock:寫鎖

二、鎖的底層

鎖的底層有公平鎖和非公平鎖。其中:

  • 公平鎖 :十分公平,不能插隊。
  • 非公平鎖 :十分不公平,可以插隊。(默認非公平鎖)

三、案例

案例一:傳統(tǒng)的synchronized實現(xiàn)

/**
 * synchronized 同步代碼塊保證售票線程安全
 *
 * @Author JUNSHI
 * @Create 2022-04-10 22:46
 */
public class SaleTicketDemo01 {
    public static void main(String[] args) {
        Ticket ticket = new Ticket();
        new Thread(()->{
            for (int i = 0; i < 60; i++) {
                ticket.sale();
            }
        },"AA").start();
        },"BB").start();
        new Thread(() -> {
        }, "CC").start();
    }
    static class Ticket{
        // 50張飄票
        private int num = 50;
        // 售票 synchronized(同步代碼塊) 本質: 隊列,鎖
        public synchronized void sale(){
            if (num > 0){
                System.out.println(Thread.currentThread().getName()+"賣出了"+(num--)+"票,剩余:"+num);
        }
}

案例二:Lock鎖的實現(xiàn)

/**
 * Lock 加鎖保證售票線程安全
 *
 * @Author JUNSHI
 * @Create 2022-04-10 22:46
 */
public class SaleTicketDemo02 {

    public static void main(String[] args) {
        Ticket2 ticket = new Ticket2();
        new Thread(()->{ for (int i = 0; i < 60; i++) ticket.sale(); },"AA").start();
        new Thread(()->{ for (int i = 0; i < 60; i++) ticket.sale(); },"BB").start();
        new Thread(()->{ for (int i = 0; i < 60; i++) ticket.sale(); },"CC").start();
    }

    static class Ticket2{
        // 50張飄票
        private int num = 50;

        // 加鎖三部曲
        // 1、 創(chuàng)建鎖 => new ReentrantLock();
        // 2、 加鎖 =>  lock.lock();
        // 3、 釋放鎖 => lock.unlock();
        public void sale(){
            // 可重入鎖  默認:非公平鎖:十分不公平,可以插隊。(默認非公平鎖)
            Lock lock = new ReentrantLock();
            // 加鎖
            lock.lock();
            try {
                // 執(zhí)行業(yè)務
                if (num > 0){
                    System.out.println(Thread.currentThread().getName()+"賣出了"+(num--)+"票,剩余:"+num);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                // 解鎖
                lock.unlock();
            }
        }
    }
}

四、Lock鎖和synchronized的區(qū)別

  1. snchronized是內置Java關鍵字;Lock是一個Java類。
  2. synchronized 無法判斷獲取鎖的狀態(tài);Lock可以判斷是否獲取到了鎖。(boolean b = lock.tryLock();)
  3. synchronized會自動釋放鎖Lock必須要手動釋放鎖,如果不釋放鎖,死鎖。
  4. synchronized線程1獲得鎖阻塞時,線程2會一直等待下去;Lock鎖線程1獲得鎖阻塞時,線程2等待足夠長的時間后中斷等待,去做其他的事。
  5. synchronized可重入鎖:不可以中斷的,非公平;Lock可重入鎖:可以判斷鎖,非公平(可以自己設置)。
  6. lock.lockInterruptibly();方法:當兩個線程同時通過該方法想獲取某個鎖時,假若此時線程A獲取到了鎖,而線程B只有在等待,那么對線程B調用threadB.interrupt()方法能夠中斷線程B的等待過程。
  7. synchronized適合鎖少量的代碼同步問題; Lock適合鎖大量的同步代碼。

到此這篇關于Java并發(fā)系列之JUC中的Lock鎖與synchronized同步代碼塊的文章就介紹到這了,更多相關Java synchronized同步代碼塊內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 查看Spring容器中bean的五種方法小結

    查看Spring容器中bean的五種方法小結

    近期在寫Spring項目的時候,需要通過注解的形式去替代之前直接將Bean存放在Spring容器這種方式,以此來簡化對于Bean對象的操作,這篇文章主要給大家介紹了關于如何查看Spring容器中bean的五種方法,需要的朋友可以參考下
    2024-05-05
  • Netty分布式源碼分析監(jiān)聽讀事件

    Netty分布式源碼分析監(jiān)聽讀事件

    這篇文章主要介紹了Netty分布式監(jiān)聽讀事件方法的代碼跟蹤解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-03-03
  • Java中關于泛型、包裝類及ArrayList的詳細教程

    Java中關于泛型、包裝類及ArrayList的詳細教程

    泛型可以在類或方法中預支地使用未知的類型。這篇文章主要介紹了Java中關于泛型、包裝類及ArrayList的詳細教程,需要的朋友可以參考下
    2021-12-12
  • IDEA?服務器熱部署圖文詳解(On?Update?action/On?frame?deactivation)

    IDEA?服務器熱部署圖文詳解(On?Update?action/On?frame?deactivation)

    這篇文章主要介紹了IDEA?服務器熱部署詳解(On?Update?action/On?frame?deactivation),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-03-03
  • Jmeter中的timeshift()函數(shù)獲取當前時間進行加減

    Jmeter中的timeshift()函數(shù)獲取當前時間進行加減

    這篇文章主要介紹了Jmeter中的timeshift()函數(shù)獲取當前時間進行加減,TimeShift(格式,日期,移位,語言環(huán)境,變量)可對日期進行移位加減操作,本文給大家詳細講解,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • IDEA自定義Maven archetype的方法步驟

    IDEA自定義Maven archetype的方法步驟

    在創(chuàng)建Maven的項目時我們發(fā)現(xiàn)了一個很不方便的問題,就是每次創(chuàng)建Maven的工程的時候,都需要選擇一個骨架,本文主要介紹了IDEA自定義Maven archetype的方法步驟,感興趣的可以了解一下
    2022-03-03
  • 基于jvm java內存區(qū)域的介紹

    基于jvm java內存區(qū)域的介紹

    下面小編就為大家?guī)硪黄趈vm java內存區(qū)域的介紹。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • SpringBoot讀取properties或者application.yml配置文件中的數(shù)據(jù)

    SpringBoot讀取properties或者application.yml配置文件中的數(shù)據(jù)

    這篇文章主要介紹了SpringBoot讀取properties或者application.yml配置文件中的數(shù)據(jù),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-06-06
  • 詳解mybatis流式查詢與分頁插件

    詳解mybatis流式查詢與分頁插件

    這篇文章主要介紹了mybatis流式查詢與分頁插件,本文通過實例代碼給大家講解的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-11-11
  • jenkins安裝及其配置筆記

    jenkins安裝及其配置筆記

    這篇文章主要介紹了jenkins安裝及其配置筆記,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01

最新評論

游戏| 南靖县| 隆回县| 弥渡县| 论坛| 玉溪市| 同心县| 东至县| 无棣县| 上栗县| 清远市| 凤凰县| 宣城市| 海门市| 光泽县| 东乌珠穆沁旗| 天柱县| 泾源县| 沙洋县| 义乌市| 若羌县| 永济市| 平昌县| 句容市| 那曲县| 大丰市| 尼木县| 永嘉县| 南木林县| 贵南县| 左贡县| 凌海市| 泸溪县| 大安市| 龙山县| 阜新| 永寿县| 乡宁县| 龙口市| 永川市| 台北县|