一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

JUC并發(fā)包、volatile、CAS、ConcurrentHashMap及各類鎖一網(wǎng)打盡

 印度阿三17 2019-08-25

??之前學過比較長一段時間的JUC相關的知識,現(xiàn)在想復習一遍,因此在這里做一個簡單的筆記。
??本篇博文都是比較基礎的概念,而且比較簡要,大家如果要深入理解,盡量多看一些高并發(fā)相關的書籍,如果才剛接觸這一塊的同學,建議學習《java并發(fā)編程從入門到精通》,這一本書入門還是很不錯的!

一、volatile


1.什么是volatile

volatile是java虛擬機提供的輕量級的同步機制;

它具有三大特性:
保證可見性;
不保證原子性;
禁止指令重排(有序性)

2.JMM-java內(nèi)存模型特性

可見性、原子性、有序性

3.volatile不保證原子性的問題怎么解決

使用java.util.concurrent.atomic類
AtomicInteger a = new AtomicInteger();

Atomic是怎么實現(xiàn)的呢?
主要是用到了CAS

4.CAS

全稱Compare-and-swap,它是一條CPU并發(fā)原語,它的核心類是Unsafe類,可以直接操作內(nèi)存。(開掛的人生不需要解釋…)

CAS實現(xiàn)了原子性,怎么實現(xiàn)的呢?
CAS原理:CAS有三個操作數(shù):內(nèi)存中V,舊的預期值A,要修改的更新值B;
當且僅當就的預期值A和內(nèi)存值V相同時,將內(nèi)存值V修改為B。

CAS缺點:ABA問題;
有T1和T2兩個線程,T1改一次10s,T2改一次2s,T2先把主內(nèi)存中的A改成B,后面又將B改回為A,這時候輪到T1,發(fā)現(xiàn)主內(nèi)存中的值為自己的期望值,就直接進行修改。這樣首位是一樣的,但中間已經(jīng)被修改過多次了,而T1以為是操作成功的。這樣有可能導致過程存在問題。簡單理解就是貍貓換太子。

如何規(guī)避ABA問題?
使用原子引用更新AtomicStampedReference

二、集合線程安全類

1.ArrayList

ArrayList線程不安全
為什么不安全,因為add()方法沒有加synchronized
而Vector()是線程安全的,因為其add()方法加鎖了

集合線程安全問題拋出的異常
并發(fā)爭搶修改導致
java.util.ConcurrentModificationException

2.解決ArrayList線程不安全

使用Vector()
使用Collections.synchronizedList(new ArrayList<>());
使用寫時復制CopyOnWriteArrayList();

3.寫時復制CopyOnWriteArrayList();

使用了讀寫分離的思想;
寫的時候先將容器復制一份,然后修改其中的元素,最后將引用指向這個新的容器。

4.HashMap與HashSet的聯(lián)系

HashMap的Key是HashSet,而value是一個叫RPESENT的常量

5.HashMap線程不安全怎么辦?

使用ConcurrentHashMap

了解ConcurrentHashMap嗎?
是JUC包中最重要的類
java1.7的ConcurrentHashMap,使用分段鎖技術,可以參考
https://www.cnblogs.com/ITtangtang/p/3948786.html
java1.8的ConcurrentHashMap摒棄了1.7的segment設計,而是在1.8HashMap的基礎上實現(xiàn)了線程安全的版本,即也是采用數(shù)組 鏈表 紅黑樹的形式。
https://www.cnblogs.com/nullzx/p/8647220.html
https://my.oschina.net/pingpangkuangmo/blog/817973

三、鎖

1.公平鎖和非公平鎖

公平鎖:多個線程按照申請鎖的順序來獲取鎖。非公平鎖就是不按順序來,可以隨意插隊。
ReentrantLock默認非公平鎖、synchronized也是非公平鎖

2.可重入鎖(遞歸鎖)

簡單理解:只要拿到一把鑰匙,其中的內(nèi)容都能獲得鎖;
舉例來說,家大門的鎖已經(jīng)開了,其他廚房和廁所的鎖也可以獲得。就是在類中可以把兩個方法理解為同一把鎖。

ReentrantLock和synchronized都是非公平的可重入鎖,主要是為了防止死鎖

3.自旋鎖

一種沒有用到鎖的方式,采用循環(huán)的方式去嘗試獲取鎖。

4.讀寫鎖-獨占鎖(寫鎖)/共享鎖(讀鎖)

ReentrantLock和synchronized都是獨占鎖
ReentrantReadWriteLock的寫鎖是獨占鎖,讀鎖是共享鎖,實現(xiàn)了ReadWriteLock接口

讀寫分別調(diào)用不同的方法
讀調(diào)用writeLock().lock();與writeLock().unlock();
寫調(diào)用readLock().lock();與readLock().unlock();

5. CountDownLatch/CyclicBarrier/Semaphore

三者都是JCU包中的類,一種同步方式
CountDownLatch計數(shù)器,類似倒數(shù)發(fā)送火箭,先完成的就進行等待,每完成一個計數(shù)器減一,直到減為0,也就是所有人完成后才開始下一步,是一種同步方式;

CyclicBarrier則與前者相反,類似集齊七龍珠召喚神龍,先完成的就進行等待,每完成一個計數(shù)器加一,直到加到期望值,也就是所有人完成后才開始下一步,也是一種同步方式;

Semapho信號燈(信號量):常用于多個線程爭奪多個資源的情況,比如去網(wǎng)紅店吃飯需要排隊,后來的先在外面等待,里面每走一桌就進一桌人。

6. JUC加鎖的方法:

synchronized,Lock,ReadWriteLock,Semapho

來源:https://www./content-4-408951.html

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    国产午夜在线精品视频| 亚洲中文字幕视频一区二区| 好吊日成人免费视频公开| 亚洲天堂精品一区二区| 中文字幕日韩欧美一区| 亚洲国产av一二三区| 日韩专区欧美中文字幕| 九九热这里只有免费精品| 在线免费不卡亚洲国产| 亚洲伦理中文字幕在线观看| 中国日韩一级黄色大片| av国产熟妇露脸在线观看| 天堂网中文字幕在线观看| 国产免费成人激情视频| 国产一区麻豆水好多高潮| 国产伦精品一区二区三区精品视频| 日韩女优视频国产一区| 久久热麻豆国产精品视频| 中文字幕日韩无套内射| 欧美成人久久久免费播放| 久久免费精品拍拍一区二区| 九九热视频经典在线观看| 欧美人妻盗摄日韩偷拍| 日本高清视频在线播放| 欧美日韩亚洲国产av| 狠狠干狠狠操在线播放| 国产一区二区三区四区中文| 日韩精品一区二区三区av在线| 亚洲精品中文字幕在线视频| 亚洲最新中文字幕在线视频 | 国产又粗又猛又爽又黄的文字| 99久久精品一区二区国产| 国产日本欧美特黄在线观看| 亚洲最新中文字幕在线视频| 欧美一区二区黑人在线| 欧美日韩国产精品自在自线| 国产不卡免费高清视频| 在线一区二区免费的视频| 国产av精品一区二区| 日本精品啪啪一区二区三区| 久久国内午夜福利直播|