1. 内存溢出问题
- 适当加大内存
- 移除容器中不经常使用的对象
- 尽量不要将容器定义为成员变量
- 考虑熔断以及降级
2. 线程安全问题
例:count++,count++操作不是一个原子性操作,也就是说在某一个时刻对某一个操作的执行,有可能被其他的线程打断
- 加锁synchronized
- AtomicInteger,AtomicInteger使用的是CAS(比较再交换)算法以及自旋机制
CAS与Synchronized区别
synchronized是从悲观的角度出发:
总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。因此synchronized我们也将其称之为悲观锁。jdk中的ReentrantLock也是一种悲观锁。
CAS是从乐观的角度出发:
总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,没有修改就更新,如果被修改就触发自旋机制。CAS这种机制我们也可以将其称之为乐观锁。
CAS存在的问题:ABA问题,修改完后又修改回去
解决方案:添加版本号,除了判断数据还要判断版本号,都一致才可以更新数据