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

當(dāng)前位置:首頁(yè) > 科技  > 軟件

簡(jiǎn)單聊一聊公平鎖和非公平鎖,Parallel并行流

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

Xtv28資訊網(wǎng)——每日最新資訊28at.com

大家好,我是哪吒。Xtv28資訊網(wǎng)——每日最新資訊28at.com

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

答案是顯而易見的,不行。Xtv28資訊網(wǎng)——每日最新資訊28at.com

synchronized會(huì)極大的降低程序的性能,導(dǎo)致整個(gè)程序幾乎只能支持單線程操作,性能顯著降低。Xtv28資訊網(wǎng)——每日最新資訊28at.com

那么,如何解決呢?Xtv28資訊網(wǎng)——每日最新資訊28at.com

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

鎖的粒度更小了,也解決了這個(gè)問題,確實(shí)可以的。Xtv28資訊網(wǎng)——每日最新資訊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();    }}

為了更好的優(yōu)化,有的時(shí)候可以將synchronized代碼塊變?yōu)閰^(qū)分讀寫場(chǎng)景的讀寫鎖,也可以考慮悲觀鎖和樂觀鎖的區(qū)分。Xtv28資訊網(wǎng)——每日最新資訊28at.com

對(duì)于讀寫場(chǎng)景比較多的情況,可以使用ReentrantReadWriteLock區(qū)分讀寫,再次降低鎖的粒度,提高程序的性能。Xtv28資訊網(wǎng)——每日最新資訊28at.com

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

二、先區(qū)分一下公平鎖和非公平鎖

  • 公平鎖:多個(gè)線程按照申請(qǐng)鎖的順序去獲得鎖,線程會(huì)直接進(jìn)入隊(duì)列去排隊(duì),永遠(yuǎn)都是隊(duì)列的第一個(gè)得到鎖。
  • 非公平鎖:多個(gè)線程去獲取鎖的時(shí)候,會(huì)直接去嘗試獲取,獲取不到,進(jìn)入等待隊(duì)列,如果能獲取到,就直接獲取到鎖。

簡(jiǎn)單來說,公平鎖(誰(shuí)先排隊(duì),誰(shuí)先執(zhí)行),非公平鎖(不用排隊(duì),每個(gè)人都有機(jī)會(huì))。Xtv28資訊網(wǎng)——每日最新資訊28at.com

1、公平鎖

有一天早上,云韻、美杜莎、小醫(yī)仙結(jié)伴去買醬香拿鐵,到了咖啡店,先排隊(duì),一個(gè)一個(gè)來。不一會(huì),哪吒來了,也買醬香拿鐵,只能在末尾排隊(duì)。這個(gè)就是公平鎖。Xtv28資訊網(wǎng)——每日最新資訊28at.com

Xtv28資訊網(wǎng)——每日最新資訊28at.com

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

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 你真的理解Python Qt6基礎(chǔ)知識(shí)中的信號(hào)和槽機(jī)制嗎?

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

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 无锡市| 勃利县| 庆阳市| 井冈山市| 丹寨县| 山阳县| 于田县| 财经| 秦皇岛市| 明星| 大田县| 六安市| 斗六市| 花莲县| 全椒县| 阳城县| 乐至县| 依兰县| 夹江县| 衢州市| 小金县| 永吉县| 大渡口区| 石景山区| 章丘市| 崇文区| 兴城市| 兰考县| 哈密市| 林周县| 桐乡市| 忻州市| 九台市| 陇西县| 弋阳县| 兰溪市| 龙陵县| 阳新县| 兴城市| 舞钢市| 湘西|