乐趣区

关于java:Java多线程概念同步容器并发容器二

同步容器

同步容器通过 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

强一致性

零碎中某个数据更新后, 后续任何对该数据的读取都将获取到最新的值, 在任意时刻,所有节点中的数据是一样的。对于关系型数据库,要求更新过的数据能被后续的拜访都能看到,这是强一致性。

弱一致性

零碎中某个数据被批改后, 后续对该数据的读取有可能取得更新之后的值, 可能取得更新前的数据, 但通过不统一的窗口这段时间, 后续对该数据的读取将取得更改之后的值.

最终一致性

是弱一致性的非凡模式, 存储系统在保障没有更新的状况下, 最总所有对该数据的拜访都会失去更新后的数据. 不保障在任意时刻任意节点上的同一份数据都是雷同的,然而随着工夫的迁徙,不同节点上的同一份数据总是在向趋同的方向变动。

退出移动版