JUC锁-框架与基本概念(一)
框架與基本概念
在了解后面的內(nèi)容之前,必須要先了解基本概念:
AQS – 指AbstractQueuedSynchronizer類。
AQS是java中管理“鎖”的抽象類,鎖的許多公共方法都是在這個(gè)類中實(shí)現(xiàn)。AQS是獨(dú)占鎖(例如,ReentrantLock)和共享鎖(例如,Semaphore)的公共父類。
AQS鎖的類別 – 分為“獨(dú)占鎖”和“共享鎖”兩種。
(01) 獨(dú)占鎖 – 鎖在一個(gè)時(shí)間點(diǎn)只能被一個(gè)線程鎖占有。根據(jù)鎖的獲取機(jī)制,它又劃分為“公平鎖”和“非公平鎖”。公平鎖,是按照通過CLH等待線程按照先來先得的規(guī)則,公平的獲取鎖;而非公平鎖,則當(dāng)線程要獲取鎖時(shí),它會(huì)無視CLH等待隊(duì)列而直接獲取鎖。獨(dú)占鎖的典型實(shí)例子是ReentrantLock,此外,ReentrantReadWriteLock.WriteLock也是獨(dú)占鎖。
(02) 共享鎖 – 能被多個(gè)線程同時(shí)擁有,能被共享的鎖。JUC包中的ReentrantReadWriteLock.ReadLock,CyclicBarrier, CountDownLatch和Semaphore都是共享鎖。這些鎖的用途和原理,在以后的章節(jié)再詳細(xì)介紹。
CLH隊(duì)列 – Craig, Landin, and Hagersten lock queue
CLH隊(duì)列是AQS中“等待鎖”的線程隊(duì)列。在多線程中,為了保護(hù)競(jìng)爭(zhēng)資源不被多個(gè)線程同時(shí)操作而起來錯(cuò)誤,我們常常需要通過鎖來保護(hù)這些資源。在獨(dú)占鎖中,競(jìng)爭(zhēng)資源在一個(gè)時(shí)間點(diǎn)只能被一個(gè)線程鎖訪問;而其它線程則需要等待。CLH就是管理這些“等待鎖”的線程的隊(duì)列。
CLH是一個(gè)非阻塞的 FIFO 隊(duì)列。也就是說往里面插入或移除一個(gè)節(jié)點(diǎn)的時(shí)候,在并發(fā)條件下不會(huì)阻塞,而是通過自旋鎖和 CAS 保證節(jié)點(diǎn)插入和移除的原子性。
CAS函數(shù) – Compare And Swap
CAS函數(shù),是比較并交換函數(shù),它是原子操作函數(shù);即,通過CAS操作的數(shù)據(jù)都是以原子方式進(jìn)行的。例如,compareAndSetHead(), compareAndSetTail(), compareAndSetNext()等函數(shù)。它們共同的特點(diǎn)是,這些函數(shù)所執(zhí)行的動(dòng)作是以原子的方式進(jìn)行的。
總結(jié)
以上是生活随笔為你收集整理的JUC锁-框架与基本概念(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JUC原子类-类成员(五)
- 下一篇: JUC锁-互斥锁ReentrantLoc