list_set_queue
list
ArrayList
默认长度为0, 第一次去add元素的时候数组长度为10(DEFAULT_CAPACITY=10), 当添加到第11个元素的时候会自动扩容 1.5*capacity
在循环中对list做add和remove操作就会报并发异常(modcount 字段的作用), 线程不安全.
LinkedList
CopyOnWriteArrayList
写的时候复制一份,读仍然用前面的array, 写完后将指针指向另外一个即可.
对写加锁
Set 集合
TreeSet 是红黑树实现的线程不安全
ConcurrentSkipListSet 是skip list实现的并且线程安全.
Queue API
ArrayBlockingQueue
一把锁, put和take采用ReentryLock的condition.
LinkedBlockingQueue
两把锁, put和take分别在尾部和头部有不同的锁, 性能更高.
ConcurrentLinkedQueue
没有阻塞的两个api, 使用的cas模式, 效率更高, 因为这个地方没有业务逻辑仅仅是出队列 与 近队列.
SynchronousQueue
同步队列是没有容量的队列, take会阻塞,直到有元素, put时会阻塞直到被get . 缓存线程池中有用到
PriorityBlockingQueue
按照数据的顺序来出队列, 可以指定优先级 通过传入comarator接口实现,
package com.study.list_set_queue.queue;
import java.util.Comparator;
import java.util.concurrent.PriorityBlockingQueue;
public class Demo4_PriorityBlockingQueue3 {
public static void main(String args[]){
PriorityBlockingQueue<Student> queue = new PriorityBlockingQueue<>(5, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int num1 = o1.age;
int num2 = o2.age;
if (num1 > num2)
return 1;
else if (num1 == num2)
return 0;
else
return -1;
}
});
queue.put(new Student(10, "enmily"));
queue.put(new Student(20, "Tony"));
queue.put(new Student(5, "baby"));
for (;queue.size() >0;){
try {
System.out.println(queue.take().name);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Student{
public int age;
public String name;
public Student(int age, String name){
this.age = age;
this.name = name;
}
}