ThreadLocal

主要用于多线程共享变量,就是存储每个线程自己的对象,比如日期工具类,每个线程存储自己的SimpleDateFormat,防止pattern应用错误,因为SimpleDateFormat是线程不安全的,直接用synchronized方法性能不好

private static final ThreadLocal<SimpleDateFormat> threadLocal = new ThreadLocal<>();
private static final Object object = new Object();
private static SimpleDateFormat getDateFormat(String pattern) throws RuntimeException {
        SimpleDateFormat dateFormat = threadLocal.get();
        //if (null == dateFormat) {
            synchronized (object) {
                if (null == dateFormat) {
                    dateFormat = new SimpleDateFormat(pattern);
                    dateFormat.setLenient(false); //代表严格解析
                    threadLocal.set(dateFormat);
                }
            }
        //}
        dateFormat.applyPattern(pattern);
        return dateFormat;
    }

ThreadLocal妙用

private static final ThreadLocal<Gson> GS0N_LOCAL = ThreadLocal.withInitial(Gson::new);

//伪代码,这个kafka注解内部实现会开启多线程,所以线程数是固定的,所以可以达到ThreadLocal复用线程的目的,ThreadLocal中的实例数会是固定的
//为什么不创建一个Gson成员变量,然后不同的线程调用onMessage都使用这一个成员变量?因为Gson内部有锁机制,如果共用的话加锁解锁过程性能较低
//为什么不在onMessage方法里面new Gson?这样每执行一次方法就要new一次Gson,新建对象内存开销会比较大
@KafkaListener(....)
public void onMessage(String msgData) {
    try {
        Message msg = GS0N_LOCAL.get().fromJson(msgData, Message.class);
        //doSomething
    } catch (Exception e) {
        //doSomething
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值