本篇內(nèi)容主要講解“JUC類工具有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“JUC類工具有哪些”吧!
成都創(chuàng)新互聯(lián)公司基于成都重慶香港及美國等地區(qū)分布式IDC機(jī)房數(shù)據(jù)中心構(gòu)建的電信大帶寬,聯(lián)通大帶寬,移動大帶寬,多線BGP大帶寬租用,是為眾多客戶提供專業(yè)四川綿陽服務(wù)器托管報價,主機(jī)托管價格性價比高,為金融證券行業(yè)服務(wù)器托管,ai人工智能服務(wù)器托管提供bgp線路100M獨(dú)享,G口帶寬及機(jī)柜租用的專業(yè)成都idc公司。
JUC
是 java.util.concurrent
的縮寫,其實(shí)現(xiàn)參考了 EDU.oswego.cs.dl.util.concurrent
,是 JSR 166
標(biāo)準(zhǔn)規(guī)范的一個實(shí)現(xiàn);JSR 166
是一個關(guān)于 Java
并發(fā)編程的規(guī)范提案,在 JDK
中,該規(guī)范由java.util.concurrent
包實(shí)現(xiàn)。即JUC
是 Java
提供的并發(fā)包,其中包含了一些并發(fā)編程用到的基礎(chǔ)組件。 JUC
這個包下的類基本上包含了我們在并發(fā)編程時用到的一些工具。大致可以分為以下幾類:
原子更新 Java
從 JDK1.5
開始提供了 java.util.concurrent.atomic
包,方便程序員在多線程環(huán) 境下,無鎖的進(jìn)行原子操作。在 Atomic
包里一共有 12 個類,四種原子更新方式,分別是原子更新基本類型,原子更新 數(shù)組,原子更新引用和原子更新字段。
鎖和條件變量 java.util.concurrent.locks
包下包含了同步器的框架 AbstractQueuedSynchronizer
,基于 AQS
構(gòu)建的 Lock
以及與 Lock
配合可以實(shí)現(xiàn)等待/通知模式的 Condition
。JUC
下的大多數(shù)工具類用到了 Lock
和 Condition
來實(shí)現(xiàn)并發(fā)。
線程池 涉及到的類比如:Executor
、Executors
、ThreadPoolExector
、 AbstractExecutorService
、Future
、Callable
、ScheduledThreadPoolExecutor
等等。
阻塞隊(duì)列 涉及到的類比如:ArrayBlockingQueue
、LinkedBlockingQueue
、PriorityBlockingQueue
、LinkedBlockingDeque
等等。
并發(fā)容器 涉及到的類比如:ConcurrentHashMap
、CopyOnWriteArrayList
、ConcurrentLinkedQueue
、CopyOnWriteArraySet
等等。
同步器 剩下的是一些在并發(fā)編程中時常會用到的工具類,主要用來協(xié)助線程同步。比如:CountDownLatch
、CyclicBarrier
、Exchanger
、Semaphore
、FutureTask
等等。 在學(xué)習(xí) JUC
之前我們需要了解 CAS
,AQS
和 Unsafe
,對于大部分初學(xué)并發(fā)編程的同學(xué)這幾個概念容易在腦中混淆,所以先分別說說這幾個概念。
Unsafe
是位于sun.misc
包下的一個類,也是一個不安全的類,為什么會這樣說呢? Java
是一個非常安全的語言, 無法直接訪問操作系統(tǒng)底層,而是通過本地方法進(jìn)行訪問,但卻給 Unsafe
類開了“后門”, Unsafe類提供了硬件級別的原子操作,直接訪問操作系統(tǒng)底層,操作內(nèi)存。開發(fā)人員如果不正確的使用,極容易造成程序出錯,程序崩潰等問題。,在日常使用 Unsafe
時一定要慎重。在不理解背后原理其不要使用。在Java 9
中官方提出移除 Sun.misc.Unsafe
, 對于 Java 語言生態(tài)應(yīng)用太廣并未能輕易移除,在 JAVA 9
新增加了 jdk.internal.misc.Unsafe
類來替代前者的功能。后者 不會直接暴露給應(yīng)用程序。
此圖來源美團(tuán)技術(shù)團(tuán)隊(duì):https://tech.meituan.com/2019/02/14/talk-about-java-magic-class-unsafe.html
Java
提供了非阻塞的volatile
關(guān)鍵字來解決共享變量的可見性問題,這在一定程度上彌補(bǔ)了鎖帶來的開銷問題,但是volatile
只能保證共享變量的可見性,不能解決讀—改—寫等的原子性問題。CAS(Compare And Swap
)指比較并交換,是原子操作的一種,可用于在多線程編程中實(shí)現(xiàn)不被打斷的數(shù)據(jù)交換操作,從而避免多線程同時改寫某一數(shù)據(jù)時由于執(zhí)行順序不確定性以及中斷的不可預(yù)知性產(chǎn)生的數(shù)據(jù)不一致問題。 該操作通過將內(nèi)存中的值與指定數(shù)據(jù)進(jìn)行比較,當(dāng)數(shù)值一樣時將內(nèi)存中的數(shù)據(jù)替換為新的值。JDK里面的Unsafe類提供了一系列的 compareAndSwap* 方法。CAS
算法CAS(V, E, N)
包含3
個參數(shù),V
表示要更新的變量,E
表示預(yù)期的值,N
表示新值。在且僅在V
值等于E
值時,才會將V
值設(shè)為 N
,如果V
值和 E
值不同,則說明已經(jīng)有其他線程做了更新,當(dāng)前線程什么都不做。最后,CAS
返回當(dāng)前V的真實(shí)值。Concurrent
包下所有類底層都是依靠CAS
操作來實(shí)現(xiàn),而sun.misc.Unsafe
為我們提供了一系列的CAS
操作。CAS
會遇到兩個常見的問題?
ABA
問題
自旋問題
AbstractQueuedSynchronizer
抽象同步隊(duì)列簡稱AQS
,它是實(shí)現(xiàn)同步器的基礎(chǔ)組件,并發(fā)包中鎖的底層就是使用AQS
實(shí)現(xiàn)的。AQS
定義了一套多線程訪問共享資源的同步框架,許多同步類的實(shí)現(xiàn)都依賴于它,例如常用的Synchronized
、ReentrantLock
、ReentrantReadWriteLock
、Semaphore
、CountDownLatch
等。該框架下的鎖會先嘗試以CAS
樂觀鎖去獲取鎖,如果獲取不到,則會轉(zhuǎn)為悲觀鎖(如RetreenLock
)。
到此,相信大家對“JUC類工具有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!