From 69fffc16e6f4d4adbcade1ce08de5c9e20406775 Mon Sep 17 00:00:00 2001 From: wr <191040964@qq.com> Date: Mon, 6 Jan 2020 22:54:34 +0800 Subject: [PATCH] week_04 --- week_04/23/ArrayBlockingQueue.md | 24 ++++++++++++++++++++++++ week_04/23/CopyOnWriteArrayList.md | 5 +++++ week_04/23/DelayQueue.md | 8 ++++++++ week_04/23/concurrentHashMap.md | 5 +++++ 4 files changed, 42 insertions(+) create mode 100644 week_04/23/ArrayBlockingQueue.md create mode 100644 week_04/23/CopyOnWriteArrayList.md create mode 100644 week_04/23/DelayQueue.md create mode 100644 week_04/23/concurrentHashMap.md diff --git a/week_04/23/ArrayBlockingQueue.md b/week_04/23/ArrayBlockingQueue.md new file mode 100644 index 0000000..dd9c61b --- /dev/null +++ b/week_04/23/ArrayBlockingQueue.md @@ -0,0 +1,24 @@ +1. 插入操作 add(e) :添加元素到队列中,如果队列满了,继续插入 元素会报错,IllegalStateException。 offer(e) : 添加元素到队列,同时会返回元素是否插入 成功的状态,如果成功则返回true。 + + put(e) :当阻塞队列满了以后,生产者继续通过 put 添加元素,队列会一直阻塞生产者线程,知道队列可用 offer(e,time,unit) :当阻塞队列满了以后继续添加元素, 生产者线程会被阻塞指定时间,如果超时,则线程直接 退出。 + +2. 移除操作 remove():当队列为空时,调用 remove 会返回 false, 如果元素移除成功,则返回true + + poll(): 当队列中存在元素,则从队列中取出一个元素, 如果队列为空,则直接返回null + + take():基于阻塞的方式获取队列中的元素,如果队列为 空,则take方法会一直阻塞,直到队列中有新的数据可 以消费 poll(time,unit):带超时机制的获取数据,如果队列为空, 则会等待指定的时间再去获取元素返回 + + + + + + + +总结: + +1.ArrayBlockingQueue利用takeIndex和putIndex循环利用数组; + +2.利用重入锁和两个条件保证并发安全; + +3.当putIndex索引大小等于数组长度时,需要将putIndex重新设置为0,因为后面讲到的取值也是从数组中第一个开始依次往后面取,取了之后会将原位置的值设置为null,方便循环put操作,这里要注意并不是每次都是取数组中的第一个值,takeIndex也会增加。因为做了添加操作,数组中肯定不会空,则 notEmpty条件会唤醒take()方法取值。 + diff --git a/week_04/23/CopyOnWriteArrayList.md b/week_04/23/CopyOnWriteArrayList.md new file mode 100644 index 0000000..8f2e6dd --- /dev/null +++ b/week_04/23/CopyOnWriteArrayList.md @@ -0,0 +1,5 @@ +总结: + +1.CopyOnWriteArrayList基于可重入锁机制,增删改操作需要加锁,读操作不需要加锁。 + +2.CopyOnWriteArrayList适合用在读取和遍历多的场景下,并不适合写并发高的场景; \ No newline at end of file diff --git a/week_04/23/DelayQueue.md b/week_04/23/DelayQueue.md new file mode 100644 index 0000000..823420b --- /dev/null +++ b/week_04/23/DelayQueue.md @@ -0,0 +1,8 @@ +总结: + +1.用了PriorityQueue,优先队列,二叉小顶堆,堆顶是最小的数据,通过这个队列,我们对入队的元素进行排序,root元素出队后重排序。 + +2.入队的对象必须是实现Delay接口,也就是说必须实现long getDelay(TimeUnit unit);int compareTo(T o);两个方法,即延时方法和比较方法需要子类实现。 + +3.延时队列就是基于优先队列、ReentrantLock、Condition实现延时效果的队列 + diff --git a/week_04/23/concurrentHashMap.md b/week_04/23/concurrentHashMap.md new file mode 100644 index 0000000..fb514d1 --- /dev/null +++ b/week_04/23/concurrentHashMap.md @@ -0,0 +1,5 @@ +总结: + +1. 取消了segment分段设计,直接使用Node数组来保存数据,并且采用Node数组元素作 为锁来实现每一行数据进行加锁来进一步减少并发冲突的概率 . +2. sizeCtl这个标志是在 Node 数组初始化或者扩容的时候的一个控制位标识,负数代表正在进行初始 化或者扩容操作 -1 代表正在初始化 -N 代表有N-1 有二个线程正在进行扩容操作,这里不是简单的理解成 n个线程,sizeCtl就 是-N,这块后续在讲扩容的时候会说明 0标识Node数组还没有被初始化,正数代表初始化或者下一次扩容的大小 。 +3. 几个不是很理解的点:协助扩容过程。2.U.compareAndSwapInt(this, SIZECTL, sc, (rs << RESIZE_STAMP_SHIFT) + 2为什么加2不是很理解. \ No newline at end of file -- Gitee