ThreadLocal还不会?来看看!

本文探讨了ThreadLocal在解决并发时线程共享变量问题中的作用,通过实例展示了在多线程时间格式化场景下,如何利用ThreadLocal避免线程安全问题和资源过度消耗。分析了加锁的缺点,并提出ThreadLocal作为更优解决方案。
摘要由CSDN通过智能技术生成

ThreadLocal设计是为了解决并发时,线程共享变量的问题,由于过度设计,如弱引用和哈希碰撞,导致其令人难以理解和使用成本高等问题。除此之外,使用稍有不慎还会造成脏数据和内存泄漏,共享变量更新等问题。但即便如此,ThreadLocal依然有自己的适用场景,以及无可取代的价值,比如接下来要介绍的这两种使用场景,除了 ThreadLocal 之外,还真没有合适的替代方案。

 使用场景1:本地变量

 我们以多线程格式化时间为例,来演示 ThreadLocal 的价值和作用,当我们在多个线程中格式化时间时,通常会这样操作。

  1. 当有两个线程进行时间格式化时,我们可以这样写:
import java.text.SimpleDateFormat;

import java.util.Date;


public class Test {

    public static void main(String[] args) throws InterruptedException {

        // 创建并启动线程1

        Thread t1 = new Thread(new Runnable() {

            @Override

            public void run() {

                // 得到时间对象

                Date date = new Date(1 * 1000);

                // 执行时间格式化

                formatAndPrint(date);

            }

        });

        t1.start();

        // 创建并启动线程2

        Thread t2 = new Thread(new Runnable() {

            @Override

            public void run() {

                // 得到时间对象

                Date date = new Date(2 * 1000);

                // 执行时间格式化

                formatAndPrint(date);

            }

        });

        t2.start();

    }


    /**

     * 格式化并打印结果

     * @param date 时间对象

     */

    private static void formatAndPrint(Date date) {

        // 格式化时间对象

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("mm:ss");

        // 执行格式化

        String result = simpleDateFormat.format(date);

        // 打印最终结果

        System.out.println("时间:" + result
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

little-peter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值