同步容器
同步容器通过
synchronized
关键字润饰容器, 保障同一时刻只有一个线程应用容器, 从而使容器线程平安.synchronized
的意思的同步.
1.Vector 和 ArrayList 都实现了 List 接口,Vector 对数组的操作和 ArrayList 都一样, 区别在于 Vector 在可能呈现线程平安的办法上都加了 synchronized
关键字润饰.
2.Stack 是 Vector 的子类,Stack 实现的是先进后出, 在出栈入栈都进行了 synchronized
润饰.
3.HashTable: 它实现了 Map 接口, 操作和 HashMap 一样 (区别:HashTable 不能存 null,HashMap 键值都能够为 null),HashTable 的所有操作都加了synchronized
润饰.
4.Collections 提供了线程同步汇合类
List list=Collections.synchronizedList(new ArrayList());
Set set=Collections.synchronizedSet(new HashSet());
Map map=Collections.synchronizedMap(new HashMap());
并发容器
并发容器是指容许多线程拜访的容器, 并保障线程平安. 为了尽可能进步并发,Java 并发工具包中采纳多种优化形式来进步并发容器的执行效率, 外围就是锁,CAS(无锁),COW(读写拆散), 分段锁.
1.CopyOnWriteArrayList
CopyOnWriteArrayList 相当于实现了线程平安的 ArrayList, 在对容器写入时,Copy 出一份正本数组, 实现操作后把正本数组的援用赋值给容器, 底层是通过 ReentrantLock 来保障同步. 但它通过就义容器的一致性来换取容器的并发(在 Copy 期间读取的还是旧数据), 所以不能在强统一的场景下应用.
2.CopyOnWriteArraySet
CopyOnWriteArraySet 和 CopyOnWriteArrayList 的原理一样, 它是实现了 CopyOnWrite 机制的 Set 汇合.
3.ConcurrentHashMap
ConcurrentHashMap 相当于实现了线程平安的 HashMap,Key 是无序的, 并且 key 和 value 都不能为 null, 在 JDK8 之前, 采纳分段锁的机制来进步并发, 只有在操作同一段键值对是才须要加锁.JDK8 当前才用 CAS 算法进步容器的并发.
4.ConcurrentSkipListMap
ConcurrentSkipListMap 相当于实现了线程平安的 TreeMap,key 是有序的,key 和 value 不容许为 null, 它采纳跳跃表的来代替红黑树, 起因是红黑树在插入或者删除节点时须要做旋转调整, 导致要管制的粒度太大. 而跳跃表应用的是链表, 利用 CAS 算法实现高并发线程平安.
5.ConcurrentSkipListSet
ConcurrentSkipListSet 和 ConcurrentListMap 的原理一样, 它是实现了线程平安的 TreeSet
强一致性
零碎中某个数据更新后, 后续任何对该数据的读取都将获取到最新的值, 在任意时刻,所有节点中的数据是一样的。对于关系型数据库,要求更新过的数据能被后续的拜访都能看到,这是强一致性。
弱一致性
零碎中某个数据被批改后, 后续对该数据的读取有可能取得更新之后的值, 可能取得更新前的数据, 但通过不统一的窗口这段时间, 后续对该数据的读取将取得更改之后的值.
最终一致性
是弱一致性的非凡模式, 存储系统在保障没有更新的状况下, 最总所有对该数据的拜访都会失去更新后的数据. 不保障在任意时刻任意节点上的同一份数据都是雷同的,然而随着工夫的迁徙,不同节点上的同一份数据总是在向趋同的方向变动。