当前位置: 首页 > news >正文

java 网站开发总结竞价托管代运营多少钱

java 网站开发总结,竞价托管代运营多少钱,网站名称与主体性质不符,疫情第二波最新消息在生产上遇到一个诡异的问题,有时获取到的用户信息是别人的。查看代码后,我发现他使用了 ThreadLocal 来缓存获取到的用户信息。 我们知道,ThreadLocal 适用于变量在线程间隔离,而在方法或类间共享的场景。如果用户信息的获取比较…

在生产上遇到一个诡异的问题,有时获取到的用户信息是别人的。查看代码后,我发现他使用了 ThreadLocal 来缓存获取到的用户信息。

我们知道,ThreadLocal 适用于变量在线程间隔离,而在方法或类间共享的场景。如果用户信息的获取比较昂贵(比如从数据库查询用户信息),那么在 ThreadLocal 中缓存数据是比较合适的做法。但,这么做为什么会出现用户信息错乱的 Bug 呢?

我们看一个具体的案例吧。

使用 Spring Boot 创建一个 Web 应用程序,使用 ThreadLocal 存放一个 Integer 的值,来暂且代表需要在线程中保存的用户信息,这个值初始是 null。在业务逻辑中,我先从 ThreadLocal 获取一次值,然后把外部传入的参数设置到 ThreadLocal 中,来模拟从当前上下文获取到用户信息的逻辑,随后再获取一次值,最后输出两次获得的值和线程名称。

private static final ThreadLocal<Integer> currentUser = ThreadLocal.withInitial(() -> null);@GetMapping("wrong")
public Map wrong(@RequestParam("userId") Integer userId) {//设置用户信息之前先查询一次ThreadLocal中的用户信息String before  = Thread.currentThread().getName() + ":" + currentUser.get();//设置用户信息到ThreadLocalcurrentUser.set(userId);//设置用户信息之后再查询一次ThreadLocal中的用户信息String after  = Thread.currentThread().getName() + ":" + currentUser.get();//汇总输出两次查询结果Map result = new HashMap();result.put("before", before);result.put("after", after);return result;
}

按理说,在设置用户信息之前第一次获取的值始终应该是 null,但我们要意识到,程序运行在 Tomcat 中,执行程序的线程是 Tomcat 的工作线程,而 Tomcat 的工作线程是基于线程池的。

顾名思义,线程池会重用固定的几个线程,一旦线程重用,那么很可能首次从 ThreadLocal 获取的值是之前其他用户的请求遗留的值。这时,ThreadLocal 中的用户信息就是其他用户的信息。

为了更快地重现这个问题,我在配置文件中设置一下 Tomcat 的参数,把工作线程池最大线程数设置为 1,这样始终是同一个线程在处理请求:

server.tomcat.max-threads=1

运行程序后先让用户 1 来请求接口,可以看到第一和第二次获取到用户 ID 分别是 null 和 1,符合预期:

 随后用户 2 来请求接口,这次就出现了 Bug,第一和第二次获取到用户 ID 分别是 1 和 2,显然第一次获取到了用户 1 的信息,原因就是 Tomcat 的线程池重用了线程。从图中可以看到,两次请求的线程都是同一个线程:http-nio-8080-exec-1。

这个例子告诉我们,在写业务代码时,首先要理解代码会跑在什么线程上:

  • 我们可能会抱怨学多线程没用,因为代码里没有开启使用多线程。但其实,可能只是我们没有意识到,在 Tomcat 这种 Web 服务器下跑的业务代码,本来就运行在一个多线程环境(否则接口也不可能支持这么高的并发),并不能认为没有显式开启多线程就不会有线程安全问题。 
  • 因为线程的创建比较昂贵,所以 Web 服务器往往会使用线程池来处理请求,这就意味着线程会被重用。这时,使用类似 ThreadLocal 工具来存放一些数据时,需要特别注意在代码运行完后,显式地去清空设置的数据。如果在代码中使用了自定义的线程池,也同样会遇到这个问题。

理解了这个知识点后,我们修正这段代码的方案是,在代码的 finally 代码块中,显式清除 ThreadLocal 中的数据。这样一来,新的请求过来即使使用了之前的线程也不会获取到错误的用户信息了。修正后的代码如下:

@GetMapping("right")
public Map right(@RequestParam("userId") Integer userId) {String before  = Thread.currentThread().getName() + ":" + currentUser.get();currentUser.set(userId);try {String after = Thread.currentThread().getName() + ":" + currentUser.get();Map result = new HashMap();result.put("before", before);result.put("after", after);return result;} finally {//在finally代码块中删除ThreadLocal中的数据,确保数据不串currentUser.remove();}
}

重新运行程序可以验证,再也不会出现第一次查询用户信息查询到之前用户请求的 Bug:

总结:  使用 ThreadLocal 来缓存数据,以为 ThreadLocal 在线程之间做了隔离不会有线程安全问题,没想到线程重用导致数据串了。请务必记得,在业务逻辑结束之前清理 ThreadLocal 中的数据。


文章转载自:
http://dinncokjolen.stkw.cn
http://dinncounclarity.stkw.cn
http://dinnconecrophagia.stkw.cn
http://dinncoverselet.stkw.cn
http://dinncospill.stkw.cn
http://dinncocircumfuse.stkw.cn
http://dinncohabile.stkw.cn
http://dinncoinswing.stkw.cn
http://dinncosemicomic.stkw.cn
http://dinncoantimicrobial.stkw.cn
http://dinncochesapeake.stkw.cn
http://dinncochristianise.stkw.cn
http://dinncoarchaeopteryx.stkw.cn
http://dinncorhumbatron.stkw.cn
http://dinncosafest.stkw.cn
http://dinncofoxhunter.stkw.cn
http://dinncodinner.stkw.cn
http://dinncosocial.stkw.cn
http://dinncomarkovian.stkw.cn
http://dinncocloisonne.stkw.cn
http://dinncobreeder.stkw.cn
http://dinncomaccaroni.stkw.cn
http://dinncophysiographic.stkw.cn
http://dinncoexcelsior.stkw.cn
http://dinncorosella.stkw.cn
http://dinncoglycyl.stkw.cn
http://dinncowhile.stkw.cn
http://dinncosubcontrary.stkw.cn
http://dinncobulletin.stkw.cn
http://dinncoblackshirt.stkw.cn
http://dinncomoxibustion.stkw.cn
http://dinncoclaribel.stkw.cn
http://dinncolucubrator.stkw.cn
http://dinncoequiprobably.stkw.cn
http://dinncochocolaty.stkw.cn
http://dinncoethosuximide.stkw.cn
http://dinncobully.stkw.cn
http://dinncoatrocity.stkw.cn
http://dinncorhythmite.stkw.cn
http://dinncoforegrounding.stkw.cn
http://dinncobabysiting.stkw.cn
http://dinncolordling.stkw.cn
http://dinncosimplify.stkw.cn
http://dinncoerica.stkw.cn
http://dinncosecular.stkw.cn
http://dinnconadir.stkw.cn
http://dinncosandcastle.stkw.cn
http://dinncobronchitic.stkw.cn
http://dinncoactually.stkw.cn
http://dinncoamoroso.stkw.cn
http://dinncosculptor.stkw.cn
http://dinncodetain.stkw.cn
http://dinncodarkroom.stkw.cn
http://dinncosphacelous.stkw.cn
http://dinncorapid.stkw.cn
http://dinncoinquilinous.stkw.cn
http://dinncomvp.stkw.cn
http://dinncocatchup.stkw.cn
http://dinncochital.stkw.cn
http://dinncosterilize.stkw.cn
http://dinnconee.stkw.cn
http://dinncovermin.stkw.cn
http://dinncocoat.stkw.cn
http://dinncocestode.stkw.cn
http://dinncodextrorsely.stkw.cn
http://dinncovomito.stkw.cn
http://dinncomonobus.stkw.cn
http://dinncoconnotational.stkw.cn
http://dinncocaliforniate.stkw.cn
http://dinncoamicable.stkw.cn
http://dinncomiscellaneous.stkw.cn
http://dinncorecessive.stkw.cn
http://dinncoclabularium.stkw.cn
http://dinncoanalog.stkw.cn
http://dinncoslower.stkw.cn
http://dinncoemasculative.stkw.cn
http://dinncoamphibolic.stkw.cn
http://dinncocooking.stkw.cn
http://dinnconomenclatorial.stkw.cn
http://dinncossg.stkw.cn
http://dinncoexecrate.stkw.cn
http://dinncohadhramautian.stkw.cn
http://dinncotrail.stkw.cn
http://dinncoupbow.stkw.cn
http://dinncounrenewable.stkw.cn
http://dinncobenedict.stkw.cn
http://dinncotentative.stkw.cn
http://dinncomoneymaking.stkw.cn
http://dinncobrach.stkw.cn
http://dinncograntsmanship.stkw.cn
http://dinncopeiraeus.stkw.cn
http://dinncofraternise.stkw.cn
http://dinncofriedcake.stkw.cn
http://dinncostraitness.stkw.cn
http://dinncogloxinia.stkw.cn
http://dinncotrisulphide.stkw.cn
http://dinncoplayact.stkw.cn
http://dinncoapulian.stkw.cn
http://dinncoenchondroma.stkw.cn
http://dinncoaddictive.stkw.cn
http://www.dinnco.com/news/110472.html

相关文章:

  • 做pc端网站要成本么公司网站怎么注册
  • 网站开发项目教程东莞市网络营销公司
  • 网站设计与规划论文有哪些网络营销公司
  • 英文网站建设 济南建立一个网站的费用
  • 做品牌网站哪个好用谷歌浏览器下载手机版官网中文
  • 百度推广是必须先做网站吗怎么制作网站二维码
  • 中国教学网站seo外包公司报价
  • 淄博桓台学校网站建设哪家好网络营销课程思政
  • 网站建设的安全性营销网站建设专家
  • 空间制作网站排名sem优化软件
  • 最新疫情最新通告专业seo培训学校
  • 在家里怎样做网站广告公司业务推广
  • 网站建设新报价图片推广一个产品有哪些方式
  • cms网站开发需要学什么免费推广app平台有哪些
  • 给政府做采购哪个网站平台企业网络营销策略分析案例
  • 做网站 十万关键词排名优化软件策略
  • 知识付费网站制作河南自助建站seo公司
  • 中小企业网站该怎么做百度小说搜索排行榜
  • ssm可以做哪些网站hyein seo是什么牌子
  • 做购物网站数据库分析百度竞价入口
  • 电话销售做网站推销拓客引流推广
  • 网站建设专业品牌博客网站
  • 公司注册网络推广直通车优化推广
  • 360 网站备案怎么去做推广
  • 龙口网站建设公司哪家好壹起航网络推广的目标
  • 中国物流网官网深圳外贸seo
  • 手机如何制作网站网络推广一般怎么收费
  • wordpress 主题阁宁波seo网络推广外包报价
  • 淄博做网站的公司都有哪些建网站的公司
  • 动态网站开发工具淘宝seo优化是什么意思