zoukankan      html  css  js  c++  java
  • DateFormat是线程不安全

    昨天同事在写一个多线程代码的时候,出现了共享对象被修改的问题。

    for(int i=1; i<=pageNo; i++){
                searchDO.setPageSize(PER_PAGE);
                searchDO.setPageNo(i);
    
                Callable<List<String>> callable = new SearchThreadMethod("thread_"+i, searchDO);
                Future<List<String>> future = cuPool.submit(callable);
                if (future != null){
                    setAll.add(future);
                }
            }

    可以看出红色代码部分,i被修改了;

    想象一下,在一个多线程环境下,有两个线程持有了同一个的searchDO实例:

     1,线程1调用setPageNo(),改变了pageNo这个字段

     2,线程1中断

     3,线程2调用setPageNo(),也改变了pageNo

     4,线程1恢复,此时pageNo的值已经被线程2修改了

    可想而知,结果并不是我们要的。

    在我们常用的工具类中,比如DateFormat也不是线程安全的,所以在使用的时候需要特别注意。

    解决线程安全问题的几种方法:

    1,利用局部变量替代共享实例。

    2,使用threadLocal

    3,代码段同步,不过这个需要性能开销

    4,使用第三方开发的线程安全的jar包

    贴下今天看的两个帖子:

    1,http://www.oschina.net/translate/dateformat-with-multiple-threads

    2,http://www.infoq.com/cn/news/2012/06/ugly-code-12

  • 相关阅读:
    redhat6.4 数据包无法到达
    hibernate-Table 'XXX.XXX' doesn't exist
    LeetCode 之 TwoSum
    vim 中的常用编辑
    linux sed 批量替换多个文件中的字符串
    RedHat 6.4企业版利用iso镜像做本地yum源
    win7 vmware虚拟机上网设置
    virtualbox ubuntu下ssh连接
    Source Insight 插件
    非递归排序
  • 原文地址:https://www.cnblogs.com/iusmile/p/2866074.html
Copyright © 2011-2022 走看看