现象1:
一天之内都会出现登录之后我加入的课程调用接口报错的情况,排查发现了域名不全的问题
而为什么会一天之内一直出现呢?首先存入redis的域名是不全的,是错误的,当然从redis中查询出来的也是错误的。下面的红框的代码里设置了存入redis失效的时间是一天。
那么域名为什么不全呢?
如下图,这里遇到了一个非线程安全的全局变量ArrayList,当new了一个显得ArrayList,向里面存值,但是ArrayList中之前的值还没有及时被清空,所以拼接出来的地址是错的。
问题清楚了,那么如何解决呢?
1.用线程安全的全局变量替换ArrayList。
线程安全的变量是什么目前还不太了解,后续更新……
2.加锁,保证同一时刻只能有一个线程访问变量
在多线程的情况下,有的线程在修改数据,有的线程在读取,所以读取出来的可能是错的,ArrayList线程是不安全的,所以出现了这种情况,可以选择加synchronized锁。
同时为了避免ArrayList内数据积累越来越多,而这些数据已经是没用的,所以下一次调用要及时用ArrayList.removeAll清空掉。
现象2:
每一次登录,都会重新创建一个对象,放到公共变量中,如果遇到了并发,这里的对象将会被大量创建,然后上一个对象会失去引用,等待垃圾回收器回收,这个等待期间可能会导致cpu飙升。