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

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

转载于:https://www.cnblogs.com/iusmile/archive/2013/01/18/2866074.html

DateFormat是线程不安全相关推荐

  1. java.util类,GitHub - yutaolian/JavaUtils: 总结的一些Java常用的util类

    JavaUtils 总结的一些Java常用的util类 ###1.格式化时间 SimpleDateFormat(DateFormat)实现线程安全的使用 众所周知SimpleDateFormat(Da ...

  2. java-并发-并发容器(3)

    同样注意内层的第一个for循环,里面有语句int c = segments[i].count; 但是c却从来没有被使用过,即使如此,编译器也不能做优化将这条语句去掉,因为存在对volatile变量co ...

  3. ThreadLocal封装SimpleDateFormat

    调用Thread.currentThread()获取当前线程. JDK提供了ThreadLocal,在一个线程中传递同一个对象. ThreadLocal表示线程的"局部变量",它确 ...

  4. java litjson_仿造 Gson 的自制 json 解析器

    零 引子 0 源码 1 开发依赖 Maven : 3.3.9 (主要用作打包工具) IDE : idea 2018.3 JDK : OpenJDK 11.0.1 (OracleJDK 8 以上即可) ...

  5. Java日期工具-Joda-Time和FastDateFormat

    目录 文章目录 1.基本介绍 2.JDK中的SimpleDateFormat 2.1问题复现 2.2问题解析 2.3解决方案 2.3.1方案一:每次都实例化 2.3.2方案二:使用synchroniz ...

  6. 关于日期和时间的解析

    来源:Java编程的逻辑 日期和时间 1 基本概念 时区 我们都知道,同一时刻,世界上各个地区的时间可能是不一样的,具体时间与时区有关,一共有24个时区,英国格林尼治是0时区,北京是东八区,也就是说格 ...

  7. 计算机程序的思维逻辑 (32) - 剖析日期和时间

    本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>(马俊昌著),由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买:京东自营链接 ...

  8. Java 常用基本类 剖析日期和时间(Java8以前)

    这里写目录标题 声明 7.5 剖析日期和时间 7.5.1 基本概念 1.时区 2.时刻和纪元时 3.年历 7.5.2 日期和时间API 1.Date 2.TimeZone 3.Locale 4.Cal ...

  9. 多线程编程指南 part 2

    多线程编程指南 Sun Microsystems, Inc. 4150 Network Circle Santa Clara, CA95054 U.S.A. 文件号码819–7051–10 2006 ...

最新文章

  1. git---gui使用
  2. a++浏览器_走进浏览器内部—剖析浏览器是如何工作的(上)
  3. canvas绘制精细走动时钟
  4. 广州仙村中学2021高考成绩查询,仙村中学(增城区)
  5. 如何设计沉浸式游戏引导界面?你要知道的七大点
  6. 1009. Complement of Base 10 Integer*
  7. obj文件、mtl文件结构说明
  8. 唯此间江湖年少,偏爱纵横天下。
  9. 护卫神6588端口提权
  10. 情人节过了!你的数据还安全吗?
  11. gmoj 6860. 【2020.11.14提高组模拟】鬼渊传说
  12. 5个小技巧 教你在家里如何给花儿拍“写真”
  13. 微信小程序真机调试不能访问本地API
  14. Oracle 查询工具 在WIN7 64位下安装PLSQL
  15. 类的封装继承多态以及virtual interface-SV
  16. C++ 纯 OpenCV 实现扑克牌实时识别
  17. 使用钉钉的同时又想使用CRM功能,该怎么办?
  18. 获取app和手机信息的一些方法
  19. 一则经典技术面试题目的解读
  20. 《J2SE 回炉再造15》-------溺水狗

热门文章

  1. SpringMvc JavaMailSenderImpl 邮件发送时到时前端无法接受Json数据问题解决
  2. eclipse怎么运行不了服务器,eclipse可以运行,部署服务器启动不起来
  3. ionic4 返回键退出app
  4. SpringBoot配置文件加密
  5. java data 图像 显示_Java(JMF)获取本地摄像头,实时显示图像
  6. python解析库详解_PyQuery库详解
  7. 100内奇数之和流程图_互联网人工智能编程语言Python之while循环详解
  8. Java服务器上显示图片问题_java,_服务器读取图片到jsp显示问题,java - phpStudy
  9. 登录自动填密码php,192 实现自动登录无限路由器后台管理网页,可以记住自己输入的密码 WEB(ASP,PHP,...) 238万源代码下载- www.pudn.com...
  10. java哈希映射干什么的_java – 为什么在哈希映射中有空值或空键是有用的?