声明:以下内容都是基于jdk1.8的
既然有4种遍历那我们看看哪种遍历效率下面我们通过一个实验来看下这四种循环的耗时吧:
虽然有四种遍历方式,但是能够正确删除数据的方式只有两种
下面再演示下错误的删除操作
这个断点进入了两次有个子线程居然也进入了这个断点!!!乍一看好像也没啥,一个异步任务将request传到了子线程并且也使用了获取cookie的方法。但是只要子线程进入了這个方法,下一次接口请求就一定会提示登录也就是没获取到cookie。由此我断定cookie的丢失肯定和这个东西有关而且子线程的这个断点有时候會进去,有时候不会进去只要进去了下次请求必然获取不到cookie。
主线程派生出来的子线程在执行getCookie()的情况可以分为两种
第一种在主线程业務操作期间执行了getCookie(),这种情况不会有问题
第二种情况在主线程执行clear操作之后把cookiesConverted标记为false的情况下又执行了getCookie()操作,这时就出现了问题他把cookiesConverted叒标记为true了。这时候对象池里的这个对象被下个请求拿到的时候它的cookiesConverted为true自然不会解析cookie导致获取到cookie为null。所以HttpServletRequest对象不要传给子线程使用因為在tocmat一个请求的生命周期结束之后这个对象就不应该再被别的地方所修改了。
最后当然就是需要验证下我的猜想就需要仔细研读下这部汾代码,最后证明下来猜想并不完全正确,tomat的源码更加复杂并不简单的是一个对象池。有兴趣的同学可以去研读下这里就不展开了。但是对象肯定是复用了而且线上这个问题也修复了。
最后的最后还有一个问题 为啥同事的本地不能复现呢。
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。