美文网首页
使用ThreadLocal解决多线程问题(一)

使用ThreadLocal解决多线程问题(一)

作者: 我就要取名叫夏末 | 来源:发表于2018-11-16 09:35 被阅读0次

    使用场景:导入功能,向若干设备下导入若干条维护标准,如果设备A初始时没有值,我们假设导入Excel中的所有标准项都是有效的,那么就可以全部一次导入;如果设备A有设备,那么就无法导入任何一条新设备,无论待导入标准是否有效。
    实现逻辑很简单:首先判断A是否存在标准,查表后返回一个list<>,如果list<>为null或者size()=0,说明该设备下没有标准,那么,本次excel导入的所有有效标准都可以被写入。
    问题来源于导入框架的机制,是读取一条校验通过后直接插入数据库,导入第一条有效标准后,校验第二条时,会因为数据库中A设备下已存在最近导入的第一条标准,而拒绝导入其他数据。
    解决的思路是,使用一个map<String,Boolean>来记录能否导入,当第一条设备标准导入成功时,在map中写入(key:设备编号,value:true),这样第二条设备标准直接去查询map,若map中已有该设备编号,说明一开始该设备下时没有标准的,于是第二条也能导入。如果第一条设备标准导入失败,就把boolean写为false,这样第二条同设备下的标准查询到为false,就拒绝写入。
    这样处理后,能够正常走完逻辑了,但是如果在导入一份比较大量的数据时,是需要一些时间的,map中也已经赋了一些值,这时有第二个人,又调用了这个导入接口进行导入,这样他启动时会读取map,能够修改这个map里面的内容,这样就出现了多线程问题。
    考虑使用ThreadLocal线程本地变量解决该多线程问题。详见后续博文。

    相关文章

      网友评论

          本文标题:使用ThreadLocal解决多线程问题(一)

          本文链接:https://www.haomeiwen.com/subject/hbspfqtx.html