集合
- arrayList new 容量0 第一次add的时候扩容到10
- add 检查容量 扩容0.5 数组复制
- vector 扩容一倍 线程同步
- copyOnWriteArrayList 写时复制 读写分离
- add 不直接添加,先复制一份数组,在新数组添加,旧引用指向新数组添加时加锁,数组是volatile的其他线程可见
- hashSet
- 底层是hashMap key是传入的value, value是new Object()
- ConcurrentHashMap
- 分为16个segment
- put时 根据hashcode确定分段,对该段加锁,多线程只要数据不是同一段就可以并行
黑科技集合
- MultiMap 一个key对应多个value
Multimap<String, Integer> multimap = ArrayListMultimap.create();
multimap.put("key", 1);
multimap.put("key", 2);
//转化为常用map
Map<String, Collection<Integer>> asMap = multimap.asMap();
- BiMap value也不能重复 能实现key value翻转
HashBiMap<String,String> hashBiMap = HashBiMap.create();
hashBiMap.put("K", "V");
BiMap<String, String> inverseMap = hashBiMap.inverse();
- Table一种有两个key的hashMap
Table table = HashBasedTable.create();
table.put(1, 1, "1");
table.put(1, 2, "2");
System.out.println(table.get(1,1));
System.out.println(table.get(1,2));
System.out.println(table.row(1));
System.out.println(table.column(1));
4 MultiSet一种计数set
HashMultiset<String> multiset = HashMultiset.create();
multiset.add("a");
multiset.add("a");
multiset.add("b");
System.out.println(multiset.count("a"));//2
Set<String> set = multiset.elementSet();//去重元素
Iterator<String> iterator = multiset.iterator();//不去重
multiset.setCount("b", 5);//设置次数
锁
序号 | 锁名称 | 应用 |
---|---|---|
1 | 乐观锁 | CAS |
2 | 悲观锁 | synchronized、vector、hashtable |
3 | 自旋锁 | CAS |
4 | 可重入锁 | synchronized、Reentrantlock、Lock |
5 | 读写锁 | ReentrantReadWriteLock,CopyOnWriteArrayList、CopyOnWriteArraySet |
6 | 公平锁 | Reentrantlock(true) |
7 | 非公平锁 | synchronized、reentrantlock(false) |
8 | 共享锁 | ReentrantReadWriteLock中读锁 |
9 | 独占锁 | synchronized、vector、hashtable、ReentrantReadWriteLock中写锁 |
10 | 重量级锁 | synchronized |
11 | 轻量级锁 | 锁优化技术 |
12 | 偏向锁 | 锁优化技术 |
13 | 分段锁 | concurrentHashMap |
14 | 互斥锁 | synchronized |
15 | 同步锁 | synchronized |
16 | 死锁 | 相互请求对方的资源 |
17 | 锁粗化 | 锁优化技术 |
18 | 锁消除 | 锁优化技术 |
ReentrantReadWriteLock 和 synchronized区别
相同点:
- 解决共享变量安全访问
- 可重入锁
- 可见性 原子性
不同点:
- 显示调用lock unlock 和隐世调用区别
- ReentrantLock可响应中断
- ReentrantLock可绑定多个condition
- ReentrantLock可实现公平非公平
Queue
核心方法
异常 | 返回特殊值 |
---|---|
add | offer |
remove | poll |
element | Peek |
BlockingQueue 阻塞缓冲
- 满 put阻塞
- 空 take阻塞
- 应用场景: 生产者 消费者
异常 | 阻塞 | 直接返回 | 超时返回 |
---|---|---|---|
add | put | Offer | Offer |
Remove | Take | Poll | Poll |
哪些实现
- ArrayBlockingQueue(int capacity, boolean fair) 数组构成有界
- LinkedBlockingDeque(int capacity) 链表构成有界 默认2^32-1
- LinkedBlockingDeque(int capacity) 链表构成有界 默认2^32-1
- LinkedTransferQueue() 无界队列
- SynchronousQueue(boolean fair) 不存储
- DelayQueue() 延迟无界队列
TransferQueue 使命必达
- 生产者将元素给消费者。 有消费者消费 返回,无则等待
- tryTransfer(E e, long timeout, TimeUnit unit)
- getWaitingConsumerCount()
PriorityQueue
- PriorityQueue(int initialCapacity, Comparator<? super E> comparator)