ThreadLocal在项目中的最佳实践
来源:互联网 发布:淘宝店购物哪个软件好 编辑:程序博客网 时间:2024/05/22 03:31
simpleDateFormat
众所周知是线程不安全的,多线程中如何保证线程安全又同时兼顾性能问题呢?那就是使用ThreadLocal
维护simpleDateFormat
public class SimpleDateFormatThreadTest { static volatile AtomicInteger n = new AtomicInteger(-1); static ThreadLocal<DateFormat> sdf ; static { sdf =new ThreadLocal<DateFormat>() { @Override protected DateFormat initialValue() { return new SimpleDateFormat("yyyy-MM-dd"); } }; } public static void main(String[] args) throws ParseException, InterruptedException { Set<String> dateSet = new ConcurrentHashSet<>(); Set<Integer> numberSet = new ConcurrentHashSet<>(); Date[] dates = new Date[1000]; for (int i = 0; i < 1000; i++) { dates[i] = sdf.get().parse(i + 1000 + "-11-22"); } ExecutorService executorService = Executors.newFixedThreadPool(10); for(int i=0;i<1000;i++){ executorService.execute(new Runnable() { @Override public void run() { int number = n.incrementAndGet(); String date = sdf.get().format(dates[number]); numberSet.add(number); dateSet.add(date); System.out.println(number+" "+date); } }); } executorService.shutdown(); Thread.sleep(5000); System.out.println(dateSet.size()); System.out.println(numberSet.size()); }}
实践证明sdf的parse(String to Date)有严重的线程安全问题,format(Date to String)有轻微的线程安全问题,虽然不太明显,但还是会出现问题,这和内部的实现有关。
简单分析下使用ThreadLocal的好处,1000次转换操作,10个线程争抢执行,如果每次都去new 一个sdf,可见其效率之低,而使用ThreadLocal,是对每个线程维护一个sdf,所以最多就只会出现10个sdf,真正项目中,由于操作系统线程分片执行,所以线程不会非常的多,使用ThreadLocal的好处也就立竿见影了。
0 0
- ThreadLocal在项目中的最佳实践
- ThreadLocal在项目中的身份校验
- Spring Batch在大型企业中的最佳实践
- Spring Batch在大型企业中的最佳实践
- Greenplum在企业生产中的最佳实践
- Spring Batch 在大型企业中的最佳实践
- greendao在项目中的实践
- 项目管理最佳实践
- 项目最佳实践
- 在ios项目中使用常量的最佳实践
- iOS-在objc项目中使用常量的最佳实践
- Redis 在 SNS 类应用中的最佳实践有哪些
- MVP模式在Android开发中的最佳实践
- MVP模式在Android开发中的最佳实践
- Git Flow 在团队中的最佳实践 -- SourceTree的使用
- HTTPS理论基础及其在Android中的最佳实践
- MVP模式在Android开发中的最佳实践
- HTTPS理论基础及其在Android中的最佳实践
- Ubuntu or Deepin 上安装 mysql 数据库
- Google App Engine技术架构资料大盘点
- hdu 4349 Xiao Ming's Hope (Lucas定理)
- 使用Python提取免费的ip代理
- SpringBoot学习-第二章 常用配置方式-<Spring Boot 实战>
- ThreadLocal在项目中的最佳实践
- 大型网站架构不得不考虑的10个问题
- mac版本Beyond Compare如何一直试用和拷贝的xcode升级问题
- Android 常用 adb 命令总结
- Redis系列(八):分布式锁服务
- 软件架构设计箴言理解
- 什么导致了Context泄露:Handler&内部类
- ZMQ.Socket API
- MySql