concurrentlinkedqueue不允許有null元素,與linkblockingqueue使用的都是相同的,都是鍊錶結構。
同樣擁有內部節點類node,通過cas操作保證操作的原子性。
poll以及offer函式都是使用cas操作來保證原子性,(相當於樂觀鎖)。remove(刪除摸個節點)也是相同的
注意concurrentlinkedqueue為空的時候,取元素操作不會被阻塞,而是直接返回乙個null值。
copyonwritearraylist是arraylist 的乙個執行緒安全的變體,其中所有可變操作(add、set 等等)都是通過對底層陣列進行一次新的複製來實現的。其底層使用陣列來存放元素
cowiterator是copyonwritearraylist的攜帶起,其內部有乙個object型別的陣列作為copyonwritearraylist陣列的快照,這種快照風格的迭代器方法在建立迭代器時使用了對當時陣列狀態的引用。此陣列在迭代器的生存期內不會更改,因此不可能發生衝突,
建立迭代器以後,迭代器就不會反映列表的新增、移除或者更改。在迭代器上進行的元素更改操作(remove、set 和 add)不受支援
新增刪除操作是通過寫時複製實現的,add先加鎖,然後複製乙份長度為len+1的陣列,然後將elements新增到最後的位子,再將copyonwritearraylist的陣列用這個新陣列替換掉。set(設定某個index上的元素)一樣,也通過寫時複製實現
當一邊網cowarraylist中新增元素,一邊通過迭代遍歷的時候,實際上不會訪問真正當前的陣列,而只是訪問迭代器中的快照。
底層實際上採用的是前面的copyonwritearraylist,最為乙個內部類
內部所有的操作都轉換為cowarraylist操作實現,通過其addabsent來實現,也就是不允許元素的重複
底層基於concurrentskiplistmap來實現
並且迭代器是弱一致性的,即在迭代的過程中,可以有其他修改concurrentskiplistset的操作,不會丟擲concurrentmodificationexception異常
aqs的cas操作實際上是樂觀鎖,而偏向鎖實際上會偏向於獲取他的執行緒,其在無競爭的情況下把整個同步都消除掉,連cas操作都不做了。鎖偏向於第乙個獲得它的執行緒。如果在接下來的執行過程中,該鎖沒有被其他的執行緒獲取,則持有偏向鎖的執行緒將永遠不需要再進行同步。
關於無鎖
講到無鎖,必然是disruptor併發框架,disruptor底層依賴乙個ringbuffer來進行執行緒之間的資料交換。多執行緒對ringbuffer的讀和寫不會涉及到鎖,然而因為ringbuffer滿或者ringbuffer中沒有可消費內容引發的執行緒等待,那就要另當別論了。
簡單幾句介紹下無鎖原理,ringbuffer維護者可讀和可寫的指標,也叫游標,它指向生產者或消費者需要寫或讀的位置,而對於指標的更新是由cas來完成的,這個過程中我們不需要加鎖/解鎖的過程。
使用到future或者futuretask應該注意到的問題:
任務超時時間,一方面我們不能夠無限期的占用執行緒資源,另一方面我們不能夠讓外部無限期的等待,因此timeout變得尤為重要。
主動取消任務,假如我們覺得timeout不夠靈活,通常場景是當我們在timeout之前已經知道futuretask不需要再繼續為我們工作的時候,我們可以先判斷任務是否已經done(isdone),如果沒有done,我們可以主動的將任務取消掉,這個時候future定義的cancel可以派上用場。
任務異常資訊,還記得我們最初提交的runnable和callable麼,當任務丟擲了異常我們如何get到異常資訊呢,futuretask其實是**了runnable和callable的執行,捕獲異常並將異常資訊交給outcome,因此通過futuretask,我們同樣可以獲得任務內部丟擲的異常資訊。
目錄 JUC集合框架目錄
1.juc juc集合框架綜述 2.juc jdk1.8原始碼分析之concurrenthashmap 一 3.juc jdk1.8原始碼分析之concurrentskiplistmap 二 4.juc jdk1.8原始碼分析之arrayblockingqueue 三 5.juc jdk1.8原始碼...
JUC框架學習 lock鎖總結
locke 介面 支援予以不同 重入,公平等 的鎖規則 1.公平鎖 2.非公平鎖 3.可重入鎖 實現lock介面的鎖,其構造方法中有 boolean fair引數控制,當fair為 true時,是公平鎖,反之為非公平鎖。預設是非公平鎖。以reentrantlock為例原始碼如下 無參構造 creat...
FMDB 框架小結
fmdb 框架是對 sqlite 資料庫 c 語言介面的 objective c 封裝,即對sqlite3.h檔案中相關介面的封裝。sqlite3 的使用十分簡單,主要是下面兩個物件 常用函式的使用 fmdb 框架基本也就涉及這幾個函式。typedef struct sqlite3 sqlite3 ...