如果在多线程环境下使用HashMap会有什么现象发生呢??G1和CMS?HTTP幂等性?几条常见解决重复提交的方案?

  • put()的时候导致的多线程数据不一致(丢失数据)

  • resize()操作会导致环形链表

  • jdk1.8已解决环链的问题(声明两对指针,维护两个连链表)

  • fail-fast机制,对当前HashMap同时进行删除/修改会抛出ConcurrentModificationException异常

G1收集器的设计目标是取代CMS收集器,它同CMS相比,在以下方面表现的更出色:

  • G1是一个有整理内存过程的垃圾收集器,不会产生很多内存碎片

  • CMS采用的是标记清除垃圾回收算法,可能会产生不少的内存碎片

  • G1的Stop The World(STW)更可控,G1在停顿时间上添加了预测机制,用户可以指定期望停顿时间

分享几条常见解决重复提交的方案:

  1. 同步锁(单线程,在集群可能会失效)

  2. 分布式锁如redis(实现复杂)

  3. 业务字段加唯一约束(简单)

  4. 令牌表+唯一约束(简单推荐)---->实现幂等接口的一种手段

  5. mysql的insert ignore或者on duplicate key update(简单)

  6. 共享锁+普通索引(简单)

  7. 利用MQ或者Redis扩展(排队)

  8. 其他方案如多版本控制MVCC 乐观锁 悲观锁 状态机等。。

猜你喜欢

转载自blog.csdn.net/chang384915878/article/details/87928136