AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

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

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

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

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

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

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

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

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

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

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

鎖的粒度更小了,也解決了這個問題,確實可以的。0rm28資訊網——每日最新資訊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代碼塊變為區分讀寫場景的讀寫鎖,也可以考慮悲觀鎖和樂觀鎖的區分。0rm28資訊網——每日最新資訊28at.com

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

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

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

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

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

1、公平鎖

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

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

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

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

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

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

標簽:
  • 熱門焦點
Top