压力测试存在的问题

佚名 / 2023-08-04 / 原文

1. 内存溢出问题

  1. 适当加大内存
  2. 移除容器中不经常使用的对象
  3. 尽量不要将容器定义为成员变量
  4. 考虑熔断以及降级

2. 线程安全问题

例:count++,count++操作不是一个原子性操作,也就是说在某一个时刻对某一个操作的执行,有可能被其他的线程打断

  1. 加锁synchronized
  2. AtomicInteger,AtomicInteger使用的是CAS(比较再交换)算法以及自旋机制
    CAS与Synchronized区别
    synchronized是从悲观的角度出发:
    总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。因此synchronized我们也将其称之为悲观锁。jdk中的ReentrantLock也是一种悲观锁。

CAS是从乐观的角度出发:
总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,没有修改就更新,如果被修改就触发自旋机制。CAS这种机制我们也可以将其称之为乐观锁。
CAS存在的问题:ABA问题,修改完后又修改回去
解决方案:添加版本号,除了判断数据还要判断版本号,都一致才可以更新数据