请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

使用ThreadLocal是不是还是没有解决实例化多个对象的问题?

比如ThreadLocalNormalUsage03类中打印了1000个日期任务,用的是一个时间格式化对象,解决了ThreadLocalNormalUsage02中实例多个时间格式化对象的问题。ThreadLocalNormalUsage04类中加锁来解决ThreadLocalNormalUsage03类中只使用一个时间格式化对象的线程安全问题,但是没有解决并行执行的问题,效率低。ThreadLocalNormalUsage05利用ThreadLocal解决ThreadLocalNormalUsage04的线程安全问题,提高效率,但还是每个线程实例化了一个日期格式对象?

正在回答 回答被采纳积分+3

1回答

悟空 2020-08-12 18:17:17

每个线程一个独立对象,这是合理的

0 回复 有任何疑惑可以回复我~
  • 1. 如果每个线程最后都需要remove的话, 那1000个任务还是相当于创建了1000个SimpleDateFormat对象, 只是因为线程池的原因内存中同时存在的SimpleDateFormat对象变少了(数量等于当前运行的线程数), 既然也创建了1000个SimpleDateFormat对象, 那我为什么还做成ThreadLocal的呢?
    2. 阿里开发手册中提到要在结束时进行remove, 全局变量场景remove我觉得是必要的, 那工具类的场景需要remove吗?
    3. 类似SimpleDateFormat的这种ThreadLocal的工具类是否是为了防止在线程运行的过程中多次使用SimpleDateFormat(多次创建对象)而设计的呢?假设线程执行任务从头到尾只用过一次SimpleDateFormat,那是不是就没有必要弄ThreadLocal类型的了呢?
    
    望悟空老师解答~~~~ :)
    回复 有任何疑惑可以回复我~ 2020-09-03 13:32:00
  • 1.是每个线程一个SimpleDateFormat对象,不是每个任务。
    2.工具类可以不remove,因为工具类随时都可能使用
    3.主要还是为了保证SimpleDateFormat的线程安全性。如果是全局线程安全,那么可以用static的
    回复 有任何疑惑可以回复我~ 2020-09-04 14:51:02
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信