集合的补充(2022.7.21)

集合

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],这是由于线程内的局部数组对象,线程之间是不可见的。

锁分段
对数据集进行分段,每段竞争一把锁,不同数据段之间的数据不存在锁竞争,从而提高高并发访问效率

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值