参考:
> https://blog.csdn.net/xy3233/article/details/93607956
JUC并发包包含:
1) 原子类(Atomic )
2) 锁框架( locks )
3) 同步器框架 (AbstractQueuedSynchronizer)
4) 执行器框架(Executor)
5) 并发集合类
Atomic类主要利用 CAS (compare and swap) + volatile 和 native 方法来保证原子操作,从而避免 synchronized 的高开销,执行效率大为提升,Atomic是一种乐观锁 , 每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。
CAS原理: 使用3个基本操作数: 内存地址V, 旧的预期值A, 新值B。 当需要更新一个变量时,只有内存地址V和旧的预期值A相等时,猜会将内存地址V对应的值修改为B,否则将重新尝试,这个过程叫自旋。
CAS缺点: ①自旋操作在高并发情况下,CPU开销比较大 ②只能修饰属性,不能修饰代码块 ③ABA问题
ABA问题: 线程甲和线程乙,从内存中取得到值A,线程甲将内存中的值由A改成B,后又从B改成A,线程乙进行操作时,对比自己手中的值和内存中的值发现都是A, 但此时内存中的A已经不是原来的A了。
解决ABA的方法: 加版本号
使用AtomicStampedReference,它的compareAndSet有四个参数 expectedReference代表的是期望被修改的值,newReference代表的是新的值,expectedStamp代表期望被修改的版本号,newStamp代表新的版本号,只有当预期值和均当前内存值相同时才会修改成功。
JUC—并发集合类
Collection集合:List(LinkedList, ArrayList, Vector, Stack) 和 Set(HastSet , TreeSet)
ArrayList: 底层数组,线程不安全
LinkedList: 双向链表,线程不安全
vector: 数组,线程安全
HashSet: 无序不允许重复, 底层HashMap实现,线程不安全
TreeSet: 有序不允许重复, 通过TreeMap实现,线程不安全
Map的实现类主要有: HashMap, Hashtable和TreeMap
HashMap: 底层数组和链表,基于hash表实现,允许空值空键,线程不安全
HashTable : 线程安全(synchronized实现),不允许null键和null值.
TreeMap: 基于红黑树(Red-Black tree)实现.线程不安全;
JUC包中List和Set实现类
(1)CopyOnWriteArrayList相当于线程安全的ArrayList,它实现了List接口,内部实现了ReentrantLock。
(2)CopyOnWriteArraySet相当于线程安全的HashSet,它继承于AbstractSet类 内部是通过“动态数组(CopyOnWriteArrayList)”实现的。
JUC包中Map实现类
(1)ConcurrentHashMap是线程安全的哈希表(相当于线程安全的HashMap);ConcurrentHashMap是通过“锁分段”来实现的
(2)ConcurrentSkipListMap是线程安全的有序的哈希表(相当于线程安全的TreeMap); ConcurrentSkipListMap是通过“跳表”来实现的
JUC集合包中Queue的实现类:
(1) ArrayBlockingQueue是数组实现的线程安全的有界的阻塞队列。
(2) LinkedBlockingQueue是单向链表实现的(指定大小)阻塞队列,该队列按 FIFO(先进先出)排序元素。
(3) LinkedBlockingDeque是双向链表实现的(指定大小)双向并发阻塞队列,该阻塞队列同时支持FIFO和FILO两种操作方式。
(4) ConcurrentLinkedQueue是单向链表实现的无界队列,该队列按 FIFO(先进先出)排序元素。
(5) ConcurrentLinkedDeque是双向链表实现的无界队列,该队列同时支持FIFO和FILO两种操作方式。