国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Java并發(fā)之synchronized關(guān)鍵字和Lock接口

這篇具有很好參考價值的文章主要介紹了Java并發(fā)之synchronized關(guān)鍵字和Lock接口。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

Java并發(fā)之synchronized關(guān)鍵字和Lock接口

歡迎點(diǎn)贊閱讀,一同學(xué)習(xí)交流,有疑問請留言 。
GitHub上也有開源 JavaHouse,歡迎star

引用

當(dāng)開發(fā)過程中,我們遇到并發(fā)問題。怎么解決?

一種解決方式,簡單粗暴:上鎖。將千軍萬馬都給攔下來,只允許一個人過獨(dú)木橋。書面意思就是將并行的程序變成串行的程序?,F(xiàn)實(shí)的鎖有門鎖、掛鎖和抽屜鎖等等。在Java中,我們的鎖就是synchronized關(guān)鍵字和Lock接口。

synchronized關(guān)鍵字

synchronized也叫同步鎖,是Java里面的關(guān)鍵字。我們可以猜測到synchronized原理也JVM虛擬機(jī)有關(guān)聯(lián)。

synchronized鎖的是對象。對象里面有一個叫做監(jiān)視鎖(monitor)的東西,監(jiān)視鎖依賴操作系統(tǒng)的互斥鎖(Mutex Lock)。操作系統(tǒng)切換線程其實(shí)就是從用戶態(tài)編程核心態(tài)(cpu的兩種狀態(tài))。這個代價有點(diǎn)高,所以synchronized這個重量級鎖后面也引進(jìn)了偏向鎖和輕量級鎖。

加鎖(監(jiān)視鎖monitor)過程分析():

  1. 當(dāng)monitor的進(jìn)入數(shù)為0,線程A進(jìn)入
  2. monitor的進(jìn)入數(shù)為1
  3. 線程B想進(jìn)入該monitor就會被阻塞。

線程A可以重復(fù)進(jìn)入該monitor,所以synchronized是可重入鎖,和Lock實(shí)現(xiàn)的鎖一樣。

  • 程序驗(yàn)證
public class SynchronizedTest {
    private static  int i = 0;
    public static void main(String[] args) {
        test();
    }

    public static void test(){
        synchronized (SynchronizedTest.class){
            synchronized (SynchronizedTest.class){
                i++;
            }
        }
    }
}
  • 運(yùn)行結(jié)果
    程序正常運(yùn)行,沒有報錯

synchronized可以修飾方法以及代碼塊,代碼塊就是上面重入鎖的例子。

  • 修飾方法
public class SynchronizedTest {
    static int n = 100;
    final static CountDownLatch start = new CountDownLatch(n);
    private static  int i = 0;
    public static void main(String[] args) throws InterruptedException {
        for (int j = 0; j < n; j++) {
            Thread thread = new Thread(new addNoSynchronized());
            thread.start();
        }
        start.await();
        System.out.println(i);
    }

    public static class addSynchronized implements Runnable{
        @Override
        public void run() {
            addSynchronized();
        }
        public static synchronized void addSynchronized(){
            for (int j = 0; j < 1000; j++) {
                i++;
            }
            start.countDown();
        }
    }
}

  • 運(yùn)行結(jié)果
100000

如果去掉 synchronized 關(guān)鍵字的話,運(yùn)行結(jié)果大概率不是 100000,因?yàn)榫€程不安全問題。

Lock接口

一般我們使用 ReentrantLock 類作為重入鎖,實(shí)現(xiàn)Lock接口。

  • 使用方法
public class ReentranLockTest {
    private static int j;
    private static int n = 100;
    private static CountDownLatch latch = new CountDownLatch(n);
    public static void main(String[] args) throws InterruptedException {
        for (int i = 0; i < n; i++) {
            new Thread(new LockTest()).start();
        }
        latch.await();
        System.out.println("結(jié)果為:"+j);
    }

    public static class LockTest implements Runnable{
        static Lock lock = new ReentrantLock();
        @Override
        public void run() {
            lockTest();
            latch.countDown();
        }
        private void lockTest() {
            lock.lock();
            try {
                for (int i = 0; i < 1000; i++) {
                        j++;
                }
            }finally {
                lock.unlock();
            }
        }
    }
}
  • 運(yùn)行結(jié)果
結(jié)果為:100000

這里我們鎖住的 j++ 這塊資源區(qū)(公共資源),lock 是 static 關(guān)鍵字修飾的,是類對象,思考一下如果不是類對象會怎么樣?那就是連環(huán)鎖了(看圖)。

每一個線程都對可以用鑰匙解開這把鎖,對于程序而言,加鎖操作就沒有意義了。因?yàn)槲覀冃枰氖且粋€鎖。文章來源地址http://www.zghlxwxcb.cn/news/detail-711316.html

歡迎關(guān)注我的微信公眾號

到了這里,關(guān)于Java并發(fā)之synchronized關(guān)鍵字和Lock接口的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Java關(guān)鍵字之synchronized詳解【Java多線程必備】

    Java關(guān)鍵字之synchronized詳解【Java多線程必備】

    點(diǎn)擊 ? Mr.綿羊的知識星球 ?解鎖更多優(yōu)質(zhì)文章。 目錄 一、介紹 二、特性 1. 線程安全 2. 互斥訪問 3. 可重入性 4. 內(nèi)置鎖 三、實(shí)現(xiàn)原理 四、和其他鎖比較 1. 優(yōu)點(diǎn) 2. 缺點(diǎn) 五、注意事項(xiàng)和最佳實(shí)踐 六、使用案例 1. 案例一 2. 案例二 ? ? synchronized是Java中最基本的同步機(jī)制之一,

    2024年01月24日
    瀏覽(21)
  • Java 八股文面試過程系列之synchronized關(guān)鍵字

    本文通過一場虛擬的面試對話,詳細(xì)解析了Java中的synchronized關(guān)鍵字。從基本用法到底層實(shí)現(xiàn)原理,再到性能優(yōu)化策略,全面提升您對同步機(jī)制的理解。

    2024年02月07日
    瀏覽(36)
  • 【Synchronized關(guān)鍵字】

    Synchronized是Java中的,它用于控制多線程之間的訪問,保證同一時刻只有一個線程可以執(zhí)行被鎖定的代碼塊或方法。在多線程編程中,Synchronized是一種非常重要的機(jī)制,它可以避免多個線程同時訪問共享資源而產(chǎn)生數(shù)據(jù)不一致性的問題。 Synchronized有兩種使用方式:對代

    2024年02月08日
    瀏覽(54)
  • 線程的狀態(tài),多線程帶來的風(fēng)險,synchronized關(guān)鍵字及死鎖問題

    線程的狀態(tài),多線程帶來的風(fēng)險,synchronized關(guān)鍵字及死鎖問題

    目錄 狀態(tài)? 線程的意義 多線程帶來的風(fēng)險——線程安全? 線程安全的概念 線程不安全的原因 搶占式執(zhí)行,隨機(jī)性調(diào)度 修改共享數(shù)據(jù) 原子性-加?? 可見性 指令重排序 解決線程不安全問題(學(xué)完線程再總結(jié)) synchronized——監(jiān)視器鎖monitor lock?編輯? ?互斥 使用示例

    2024年02月06日
    瀏覽(40)
  • 《吊打面試官系列》從源碼全面解析 synchronized 關(guān)鍵字的來龍去脈

    《吊打面試官系列》從源碼全面解析 synchronized 關(guān)鍵字的來龍去脈

    ??作者簡介:大家好,我是愛敲代碼的小黃,獨(dú)角獸企業(yè)的Java開發(fā)工程師,CSDN博客專家,阿里云專家博主 ??系列專欄:Java設(shè)計模式、數(shù)據(jù)結(jié)構(gòu)和算法、Kafka從入門到成神、Kafka從成神到升仙、Spring從成神到升仙系列 ??如果感覺博主的文章還不錯的話,請??三連支持??一

    2023年04月16日
    瀏覽(14)
  • Java | interface 和 implements關(guān)鍵字【接口,看這篇就夠了】

    Java | interface 和 implements關(guān)鍵字【接口,看這篇就夠了】

    學(xué)完 繼承 、學(xué)完 多態(tài) ,但面對洶涌而來??的接口,相信很多同學(xué)都不知所措,因此我耗費(fèi)幾天幾夜的時間,搜尋大量書籍資料,苦心閉關(guān)鉆研,寫出了一篇關(guān)于Java的接口從 入門小白到精通大佬 的學(xué)習(xí)之路,相信這篇文章一定對您有所幫助?? Java接口是一系列方法的聲明

    2024年02月19日
    瀏覽(17)
  • 線程中并發(fā)安全問題(Sychronized關(guān)鍵字的底層原理)

    線程中并發(fā)安全問題(Sychronized關(guān)鍵字的底層原理)

    Sychronized的底層原理 ? sychronized 對象鎖采用互斥方式讓同一時刻至多只有一個線程能持有對象鎖,其他線程想獲取這個對象鎖只能被阻塞。 Monitor Sychronized的底層實(shí)現(xiàn)Monitor。 WaitSet:關(guān)聯(lián)調(diào)用了wait方法的線程,用于存儲處于等待狀態(tài)的線程。 EntryList:關(guān)聯(lián)了沒有獲得

    2024年02月16日
    瀏覽(22)
  • Alibaba(按關(guān)鍵字搜索商品) API接口

    Alibaba(按關(guān)鍵字搜索商品) API接口

    為了進(jìn)行電商平臺 的API開發(fā),首先我們需要做下面幾件事情。 1)開發(fā)者注冊一個賬號 2)然后為每個alibaba應(yīng)用注冊一個應(yīng)用程序鍵(App Key) 。 3)下載alibaba API的SDK并掌握基本的API基礎(chǔ)知識和調(diào)用 4)利用SDK接口和對象,傳入AppKey或者必要的時候獲取并傳入SessionKey來進(jìn)行程序

    2024年02月09日
    瀏覽(21)
  • taobao平臺上關(guān)鍵字的API接口接入說明

    ? ? 淘寶API接口是一個豐富的接口庫,提供了各種各樣的接口供開發(fā)者使用。滿足多語言開發(fā)。以下是一些常見的淘寶API接口及其代碼示例。 1. 搜索商品API接口 該API提供了搜索淘寶商品的功能,可以使用各種編程語言來訪問。以下代碼段展示了使用Python來調(diào)用該API的

    2024年02月08日
    瀏覽(21)
  • 蘇寧API接口解析,實(shí)現(xiàn)按關(guān)鍵字搜索suning商品

    蘇寧API接口解析,實(shí)現(xiàn)按關(guān)鍵字搜索suning商品

    蘇寧API接口提供了多種搜索商品的方式,其中包括按搜索。下面是一個簡單的示例,演示如何使用蘇寧API接口實(shí)現(xiàn)按搜索商品: 請求參數(shù) 請求參數(shù):q=鞋子start_price=end_price=page=cat=discount_only=sort=page_size=seller_info=nick=ppath= 參數(shù)說明:q:搜索 cat:分類ID start_p

    2024年02月09日
    瀏覽(39)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包