您好,登錄后才能下訂單哦!
本篇內容主要講解“JUC類工具有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“JUC類工具有哪些”吧!
JUC
是 java.util.concurrent
的縮寫,其實現參考了 EDU.oswego.cs.dl.util.concurrent
,是 JSR 166
標準規范的一個實現;JSR 166
是一個關于 Java
并發編程的規范提案,在 JDK
中,該規范由java.util.concurrent
包實現。即JUC
是 Java
提供的并發包,其中包含了一些并發編程用到的基礎組件。 JUC
這個包下的類基本上包含了我們在并發編程時用到的一些工具。大致可以分為以下幾類:
原子更新 Java
從 JDK1.5
開始提供了 java.util.concurrent.atomic
包,方便程序員在多線程環 境下,無鎖的進行原子操作。在 Atomic
包里一共有 12 個類,四種原子更新方式,分別是原子更新基本類型,原子更新 數組,原子更新引用和原子更新字段。
鎖和條件變量 java.util.concurrent.locks
包下包含了同步器的框架 AbstractQueuedSynchronizer
,基于 AQS
構建的 Lock
以及與 Lock
配合可以實現等待/通知模式的 Condition
。JUC
下的大多數工具類用到了 Lock
和 Condition
來實現并發。
線程池 涉及到的類比如:Executor
、Executors
、ThreadPoolExector
、 AbstractExecutorService
、Future
、Callable
、ScheduledThreadPoolExecutor
等等。
阻塞隊列 涉及到的類比如:ArrayBlockingQueue
、LinkedBlockingQueue
、PriorityBlockingQueue
、LinkedBlockingDeque
等等。
并發容器 涉及到的類比如:ConcurrentHashMap
、CopyOnWriteArrayList
、ConcurrentLinkedQueue
、CopyOnWriteArraySet
等等。
同步器 剩下的是一些在并發編程中時常會用到的工具類,主要用來協助線程同步。比如:CountDownLatch
、CyclicBarrier
、Exchanger
、Semaphore
、FutureTask
等等。 在學習 JUC
之前我們需要了解 CAS
,AQS
和 Unsafe
,對于大部分初學并發編程的同學這幾個概念容易在腦中混淆,所以先分別說說這幾個概念。 <a name="2Ivdn"></a>
Unsafe
是位于sun.misc
包下的一個類,也是一個不安全的類,為什么會這樣說呢? Java
是一個非常安全的語言, 無法直接訪問操作系統底層,而是通過本地方法進行訪問,但卻給 Unsafe
類開了“后門”, Unsafe類提供了硬件級別的原子操作,直接訪問操作系統底層,操作內存。開發人員如果不正確的使用,極容易造成程序出錯,程序崩潰等問題。,在日常使用 Unsafe
時一定要慎重。在不理解背后原理其不要使用。在Java 9
中官方提出移除 Sun.misc.Unsafe
, 對于 Java 語言生態應用太廣并未能輕易移除,在 JAVA 9
新增加了 jdk.internal.misc.Unsafe
類來替代前者的功能。后者 不會直接暴露給應用程序。
此圖來源美團技術團隊:https://tech.meituan.com/2019/02/14/talk-about-java-magic-class-unsafe.html
Java
提供了非阻塞的volatile
關鍵字來解決共享變量的可見性問題,這在一定程度上彌補了鎖帶來的開銷問題,但是volatile
只能保證共享變量的可見性,不能解決讀—改—寫等的原子性問題。CAS(Compare And Swap
)指比較并交換,是原子操作的一種,可用于在多線程編程中實現不被打斷的數據交換操作,從而避免多線程同時改寫某一數據時由于執行順序不確定性以及中斷的不可預知性產生的數據不一致問題。 該操作通過將內存中的值與指定數據進行比較,當數值一樣時將內存中的數據替換為新的值。JDK里面的Unsafe類提供了一系列的 compareAndSwap* 方法。CAS
算法CAS(V, E, N)
包含3
個參數,V
表示要更新的變量,E
表示預期的值,N
表示新值。在且僅在V
值等于E
值時,才會將V
值設為 N
,如果V
值和 E
值不同,則說明已經有其他線程做了更新,當前線程什么都不做。最后,CAS
返回當前V的真實值。Concurrent
包下所有類底層都是依靠CAS
操作來實現,而sun.misc.Unsafe
為我們提供了一系列的CAS
操作。CAS
會遇到兩個常見的問題?
ABA
問題
自旋問題
AbstractQueuedSynchronizer
抽象同步隊列簡稱AQS
,它是實現同步器的基礎組件,并發包中鎖的底層就是使用AQS
實現的。AQS
定義了一套多線程訪問共享資源的同步框架,許多同步類的實現都依賴于它,例如常用的Synchronized
、ReentrantLock
、ReentrantReadWriteLock
、Semaphore
、CountDownLatch
等。該框架下的鎖會先嘗試以CAS
樂觀鎖去獲取鎖,如果獲取不到,則會轉為悲觀鎖(如RetreenLock
)。
到此,相信大家對“JUC類工具有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。