集合
Arrays.asList把数组转换成集合时,不能使用其修改集合的相关方法(add,remove,clear),会抛出异常
原因:asList之后,后台的数据仍然是原有数组set()方法间接对数组进行值的修改操作,并没有实现集合个数的修改
fail-fast机制
对遍历操作的错误监测机制,在中途出现意料之外的修改时,会通过unchecked异常暴力进行反馈
CopyOnWriteArrayList
脏数据:由于多线程开发,硬盘与内存的数据不一致的情况
CopyOnWriteArrayList是fail-safe机制
优点是安全,并且集合的修改与副本的遍历没有任何关系。
缺点是不能读取到最新的数据
使用时注意事项:
1.尽量设置合理的容量初始值,因为扩容代价较大
2.使用批量删除,添加方法,例如addAll和removeAll操作,避免因增加一个元素而复制整个元素
例如:集合数据为100M,再写入50M,那么当时段占用的内存为(100*2)+50=250M,内存的占用会频繁导致GC的发生,从而降低服务器的性能。
CAP理论
CAP原则也称CAP定理,是指在一个分布式系统中,Consistency(一致性),Availability(可用性),Partition tolerance(分区容错性),三者不可得兼。
一致性(C):在分布式系统中的所有数据备份,在同一时刻是否有同样的值
可用性(A):保证每个请求不管成功还是失败都有响应
分区容错性(P):系统中任意信息丢失或失败不会影响系统的继续运作
HashMap存在的问题
1.数据丢失
如果两个线程同时执行到第一处时,那么一个线程的赋值会被另一个覆盖掉,会造成对象丢失。
2.已遍历区间新增元素丢失
transfer()数据迁移方法在数组非常大时会非常消耗资源,在线程迁移过程中,其他线程新增元素有可能会落在已经遍历过的哈希槽上,在遍历完之后,table数组引用指向了newTable,这时新增元素会被无情地回收
3.新表被覆盖
如果resize()完成,执行了table=newTable,则后续的元素可以在新表上进行插入操作。如果有多个线程同时执行resize,每个线程又会Entry[newCapacity],这是由于线程内的局部数组对象,线程之间是不可见的。
锁分段
对数据集进行分段,每段竞争一把锁,不同数据段之间的数据不存在锁竞争,从而提高高并发访问效率