多線程系列3-JUC阻塞隊列方法
JUC面試:
Java JUC是Java Util Concurrent的縮寫,指的是java.util.concurrent工具包,這是Java中處理并發編程的核心庫。里面的很多功能都是基于ReetrantLock來實現的。比如
ArrayBlockingQueue、
SynchronousQueue、
LinkedBlockingQueue、
DelayQueue、
PriorityBlockingQueue的一些組件。
ReetrantLock是怎么實現的呢,他是用AQS提供的方式去實現的。它是一個抽象方法:
AbstractQueuedSynchronizer,里面提供了實現鎖的方法。
里面幾個關鍵屬性:
java.util.concurrent.locks.AbstractQueuedSynchronizer#state
head節點
tail節點
是一個雙向鏈表。
JUC
JUC基本概念
Java JUC是Java Util Concurrent的縮寫,指的是java.util.concurrent工具包,這是Java中處理并發編程的核心庫。


1、通用offer方法
當是put時,如果此時隊列里的數據為0,則有可能之前有take操作被阻塞,所以需要喚醒讀鎖里面的await()操作,反之:
當是poll時,如果此時隊列里的數據為滿,則有可能之前有put操作被阻塞,所以需要喚醒寫鎖里面的await()操作

LinkedBlockingQueue 鏈表有雙鎖,put和take鎖。因為有哨兵節點,head = last = node。操作的都是node.next幾點,所以讀和寫不影響,可以并行。
java.util.concurrent.ArrayBlockingQueue
java.util.concurrent.PriorityBlockingQueue
PriorityBlockingQueue它會保證第一個數據是最小的,叫最小堆嘛。

基于數組實現的方式:




程序關鍵代碼實現:遞歸比較最小,挪到最頂點,堆頂數據最小








SynchronousQueue 中的 transfer()流程圖:

stack操作的是head,因為是先進后出,來了數據就往下面壓
queue操作的是tail,因為是先進先出,來了數據就要下面接
----------------------------------------------
對象屬性如何cas,對象屬性如何cas,對象屬性如何cas,對象屬性如何cas,對象屬性如何cas,對象屬性如何cas,
private static final long tailOffset;
UNSAFE = sun.misc.Unsafe.getUnsafe();
Class<?> k = TransferQueue.class;
tailOffset= UNSAFE.objectFieldOffset (k.getDeclaredField("tail"))
這段代碼的意思是,獲取long類型的 內存key值,用于cpu 做cas操作
TransferQueue 有屬性tail,假如我要對這個tail做cas替換操作,那么就需要用到tailOffset
UNSAFE.compareAndSwapObject(this, tailOffset, t, nt);
這里的this指的是當前線程,tailOffset cas操作鎖需要的long類型key值,被替換的對象,nt將要設置的值
浙公網安備 33010602011771號