日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

簡單聊一聊公平鎖和非公平鎖,Parallel并行流

來源: 責編: 時間:2023-10-08 07:05:59 303觀看
導讀大家好,我是哪吒。上一章提到了一個關于 i++ 和 ++i 的面試題打趴了所有人,最終方案是在兩個方法上添加synchronized關鍵字,從而避免i++的線程安全問題,不過,這樣真的好嗎?在所有有線程安全的方法都添加synchronized?答案是

NcI28資訊網——每日最新資訊28at.com

大家好,我是哪吒。NcI28資訊網——每日最新資訊28at.com

上一章提到了一個關于 i++ 和 ++i 的面試題打趴了所有人,最終方案是在兩個方法上添加synchronized關鍵字,從而避免i++的線程安全問題,不過,這樣真的好嗎?在所有有線程安全的方法都添加synchronized?NcI28資訊網——每日最新資訊28at.com

答案是顯而易見的,不行。NcI28資訊網——每日最新資訊28at.com

synchronized會極大的降低程序的性能,導致整個程序幾乎只能支持單線程操作,性能顯著降低。NcI28資訊網——每日最新資訊28at.com

那么,如何解決呢?NcI28資訊網——每日最新資訊28at.com

一、降低鎖的粒度,將synchronized關鍵字不放在方法上了,改為synchronized代碼塊。

鎖的粒度更小了,也解決了這個問題,確實可以的。NcI28資訊網——每日最新資訊28at.com

package com.guor.thread;public class SynchronizedTest2 {    int a = 1;    int b = 1;    public void add() {        System.out.println("add start");        synchronized (this) {            for (int i = 0; i < 10000; i++) {                a++;                b++;            }        }        System.out.println("add end");    }    public synchronized void compare() {        System.out.println("compare start");        synchronized (this) {            for (int i = 0; i < 10000; i++) {                boolean flag = a < b;                if (flag) {                    System.out.println("a=" + a + ",b=" + b + "flag=" + flag + ",a < b = " + (a < b));                }            }        }        System.out.println("compare end");    }    public static void main(String[] args) {        SynchronizedTest2 synchronizedTest = new SynchronizedTest2();        new Thread(() -> synchronizedTest.add()).start();        new Thread(() -> synchronizedTest.compare()).start();    }}

為了更好的優化,有的時候可以將synchronized代碼塊變為區分讀寫場景的讀寫鎖,也可以考慮悲觀鎖和樂觀鎖的區分。NcI28資訊網——每日最新資訊28at.com

對于讀寫場景比較多的情況,可以使用ReentrantReadWriteLock區分讀寫,再次降低鎖的粒度,提高程序的性能。NcI28資訊網——每日最新資訊28at.com

ReentrantReadWriteLock 還可以選擇提供了公平鎖,在沒有明確必須使用公平鎖的情況下,盡量不要使用公平鎖,公平鎖會使程序性能降低很多很多。NcI28資訊網——每日最新資訊28at.com

二、先區分一下公平鎖和非公平鎖

  • 公平鎖:多個線程按照申請鎖的順序去獲得鎖,線程會直接進入隊列去排隊,永遠都是隊列的第一個得到鎖。
  • 非公平鎖:多個線程去獲取鎖的時候,會直接去嘗試獲取,獲取不到,進入等待隊列,如果能獲取到,就直接獲取到鎖。

簡單來說,公平鎖(誰先排隊,誰先執行),非公平鎖(不用排隊,每個人都有機會)。NcI28資訊網——每日最新資訊28at.com

1、公平鎖

有一天早上,云韻、美杜莎、小醫仙結伴去買醬香拿鐵,到了咖啡店,先排隊,一個一個來。不一會,哪吒來了,也買醬香拿鐵,只能在末尾排隊。這個就是公平鎖。NcI28資訊網——每日最新資訊28at.com

NcI28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-12358-0.html簡單聊一聊公平鎖和非公平鎖,Parallel并行流

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 你真的理解Python Qt6基礎知識中的信號和槽機制嗎?

下一篇: 有了這個代碼模板,合并排序手到擒來

標簽:
  • 熱門焦點
  • 印度登月最關鍵一步!月船三號今晚進入環月軌道

    8月5日消息,據印度官方消息,月船三號將于北京時間今晚21時30分左右開始近月制動進入環月軌道。這是該探測器能夠成功的最關鍵步驟之一,如果成功將開始圍
  • 掘力計劃第 20 期:Flutter 混合開發的混亂之治

    在掘力計劃系列活動第20場,《Flutter 開發實戰詳解》作者,掘金優秀作者,Github GSY 系列目負責人戀貓的小郭分享了Flutter 混合開發的混亂之治。Flutter 基于自研的 Skia 引擎
  • 學習JavaScript的10個理由...

    作者 | Simplilearn編譯 | 王瑞平當你決心學習一門語言的時候,很難選擇到底應該學習哪一門,常用的語言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 為什么你不應該使用Div作為可點擊元素

    按鈕是為任何網絡應用程序提供交互性的最常見方式。但我們經常傾向于使用其他HTML元素,如 div span 等作為 clickable 元素。但通過這樣做,我們錯過了許多內置瀏覽器的功能。
  • 梁柱接棒兩年,騰訊音樂闖出新路子

    文丨田靜 出品丨牛刀財經(niudaocaijing)7月5日,企鵝FM發布官方公告稱由于業務調整,將于9月6日正式停止運營,這意味著騰訊音樂長音頻業務走向消亡。騰訊在長音頻領域還在摸索。為
  • 朋友圈可以修改可見范圍了 蘋果用戶可率先體驗

    近日,iOS用戶迎來微信8.0.27正式版更新,除了可更換二維碼背景外,還新增了多項實用功能。在新版微信中,朋友圈終于可以修改可見范圍,簡單來說就是已發布的朋友圈
  • Windows 11發布,微軟一改往常對老機型開放的態度

    距離 Windows 11 發布已經過去一周,在過去一周里,很多數碼愛好者圍繞其對 Android 應用的支持、對老機型的升級問題展開了激烈討論。與以往不同的是,在這次大
  • AI藝術欣賞體驗會在上海梅賽德斯奔馳中心音樂俱樂部上演

    光影交錯的鏡像世界,虛實幻化的視覺奇觀,虛擬偶像與真人共同主持,這些場景都出現在2019世界人工智能大會的舞臺上。8月29日至31日,“AI藝術欣賞體驗會”在上海
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續還將開展常態化登記。  北京科技教育體驗基
Top 主站蜘蛛池模板: 江口县| 六安市| 白河县| 怀柔区| 青州市| 尼木县| 沈阳市| 大邑县| 山西省| 陆河县| 乳源| 天津市| 界首市| 谢通门县| 厦门市| 漯河市| 泸定县| 晋宁县| 东源县| 十堰市| 芦溪县| 烟台市| 凉山| 观塘区| 平南县| 光泽县| 红桥区| 子长县| 宿松县| 宁城县| 同心县| 清丰县| 兴国县| 靖宇县| 柯坪县| 长治县| 洪江市| 马公市| 永丰县| 上林县| 兴和县|