集合
#集合大概有4种类型:List Set Queue Map
其中Vector、HashTable、Properties是线程安全的。其中ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等都是线程不安全的。(线程不安全是指:当多个线程访问同一个集合或Map时,如果有超过一个线程修改了ArrayList集合,则程序必须手动保证该集合的同步性。)
Collections提供多个获取线程安全的集合
CopyOnWriteArraylist
#写有锁 读无锁的集合 加强版的读写分离 );
其实现的原理为 :
写操作原理 :将底层的数组做了一次复制,写的是新数组 完成了赋值之后再讲新数组替换旧数组 每调用一次写 底层数组都会扩容一次 ,
读操作原理 :读的是写操作完成之前的旧数组 ,写完成之后才能读到新数组的赋值。
CopyOnWriteArraySet(
#序 无下标 元素不允许重复
线程安全的Set集合底层使用CopyOnWriteArraylist实现,不同的是在使用addIfAbsent() 添加元素,会遍历数组 ,如果有存在的元素则不添加 。
其实现的原理为 :
表面上使用add方法,底层使用的是CopyOnWriteArraylist的addIfAbsent() 来判断要插入的新值是否存在
ConcurrentHashMap
# 底层原理分两种 1.7和1.8版本
1.7 版本:初始容量为16段(Segment)为每个段加锁 当多个对象存入同一个段时 才需要互斥 使用方式与Hashmap无异
其实现的原理: 原理:使用分段锁 当多线程去访问其中的一个段时 如果是空值 直接赋上 ,如果有值 则去判断Key如果相同则覆盖 不相同 则存在最后一个值的next上面
1.8版本:通过CA原理:同步锁锁的是标头对象
,拿到锁的对象要先做节点遍历,查看有没有相同的Key值相同覆盖 不同则挂在最后一个节点上面的next上面
S交换算法和同步算法