项目实战15—登录之后我加入的课程调用接口报错

文章描述了一天内频繁出现登录后课程调用接口错误,原因是全局非线程安全的ArrayList导致域名拼接错误。解决方案包括使用线程安全的全局变量替代或者加锁确保数据同步,并且在每次调用后清理ArrayList。另外,每次登录创建新对象可能导致并发时对象过度创建,增加CPU负载,需优化对象管理以防止CPU飙升。
摘要由CSDN通过智能技术生成

现象1:
一天之内都会出现登录之后我加入的课程调用接口报错的情况,排查发现了域名不全的问题

在这里插入图片描述

而为什么会一天之内一直出现呢?首先存入redis的域名是不全的,是错误的,当然从redis中查询出来的也是错误的。下面的红框的代码里设置了存入redis失效的时间是一天。

在这里插入图片描述

那么域名为什么不全呢?
如下图,这里遇到了一个非线程安全的全局变量ArrayList,当new了一个显得ArrayList,向里面存值,但是ArrayList中之前的值还没有及时被清空,所以拼接出来的地址是错的。

在这里插入图片描述

问题清楚了,那么如何解决呢?
1.用线程安全的全局变量替换ArrayList。

线程安全的变量是什么目前还不太了解,后续更新……

2.加锁,保证同一时刻只能有一个线程访问变量

在多线程的情况下,有的线程在修改数据,有的线程在读取,所以读取出来的可能是错的,ArrayList线程是不安全的,所以出现了这种情况,可以选择加synchronized锁。

同时为了避免ArrayList内数据积累越来越多,而这些数据已经是没用的,所以下一次调用要及时用ArrayList.removeAll清空掉。

现象2:
每一次登录,都会重新创建一个对象,放到公共变量中,如果遇到了并发,这里的对象将会被大量创建,然后上一个对象会失去引用,等待垃圾回收器回收,这个等待期间可能会导致cpu飙升。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值