LinkedBlockingQueue源码学习

1.数据结构是单链表,无自动扩容,可以指定容量的大小,默认容量是最大整数值。

2.使用AtomicInteger来记录元素的个数,使用ReentrantLock,有两个ReentrantLock,一个是控制出队的的锁,一个是控制入队的锁。ReentrantLock支持偏向锁。头结点和尾结点初始化时不为空,节点持有的值为null。

3.put方法

        使用AtominInteger记录当前链表的元素的数量

        加偏向锁

        如果如果容量不够,那么当前线程就会进入等待(Condition调用await)

        把元素插入链表的尾部

        判断当前容量是否能插入其他元素,如果能,那就唤醒其他线程,

        在finally里释放锁

        

LinkedBlockingQueue源码学习_第1张图片

take方法

        思路和put的基本类似,把队头元素弹出

你可能感兴趣的:(LinkedBlockingQueue源码学习)