主要用于多线程共享变量,就是存储每个线程自己的对象,比如日期工具类,每个线程存储自己的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 } }