ThreadLocal在大量的框架级代码中被使用,比如seam、struts2等。
它主要是用来解决非静态(static)对象的静态使用。
为了方便的在任何地方使用变量,我们常将将变量设置为静态(static)的,这样就不用到处传递参数了,但是这样会导致并发问题,两个线程同时对同一变量进行操作会导致并发问题。
下面举个扩展遗留代码的示例。
遗留代码
public static AbsPayFactory getInstance(OrderType orderType) {
case JHTPAY:
factoryName = factoryName_JHTPAY;
break;
case B2B_ABC:
factoryName =factoryName_B2B_ABC;
break;
。。。。。。。
return getInstance(factoryName);
}
每当增加一个新的类型时要修改代码,增加对新类型的支持,如果增加新类型时不想修改代码就必须额外传入factoryName参数,但是getInstance方法已经在很多地方被使用了,势必要造成大量的修改。只修改方法内部
public static AbsPayFactory getInstance(OrderType orderType) {
case JHTPAY:
factoryName = factoryName_JHTPAY;
break;
case B2B_ABC:
factoryName =factoryName_B2B_ABC;
break;
case Other:
factoryName =getFactoryNameFromLocal();
break;
。。。。。。。
return getInstance(factoryName);
}
//
private static String getFactoryNameFromLocal(){
String bank=ThreadLocalUtils.blankTypeLocal.get();
......
return bank;
}
public final class ThreadLocalUtils {
public static final ThreadLocal<String> blankTypeLocal=new ThreadLocal<String>();
使用方式
OrderType type =。。。。。。;
if(type==OrderType.Other ){//新增加的情况
ThreadLocalUtils.blankTypeLocal.set(‘变量’);
}
JhtpayOrder stdOrder = getOrderAdapter(orderType, true);
getPayVerify(orderType, true);这些方法都会调用getInstance,不用去修改它们
。。。。。。。。。其他调用getInstance的方法。
finally{//最后清空
ThreadLocalUtils.blankTypeLocal.set(null);
}
如果直接使用 public static final String blankType会导致并发问题,两个并发的线程可能取到对方的值。
分享到:
相关推荐
ThreadLocal 用法详解.md
主要介绍了Java ThreadLocal用法,结合实例形式详细分析了ThreadLocal线程局部变量相关原理、定义与使用方法,需要的朋友可以参考下
主要介绍了java 中ThreadLocal 的正确用法的相关资料,需要的朋友可以参考下
虽然所有的线程都能访问到这个ThreadLocal实例,但是每个线程却只能访问到自己通过调用ThreadLocal的set()方法设置的值。即使是两个不同的线程在同一个ThreadLocal对象上设置了不同的值,他们仍然无法访问到对方的值...
主要介绍了Android 中 ThreadLocal使用示例的相关资料,这里提供示例代码帮助大家学习理解这部分内容,需要的朋友可以参考下
在我们日常 Web 开发中难免遇到需要把一个参数层层的传递到最内层,然后中间层根本不需要使用这个参数,或者是仅仅在特定的工具类中使用,这样我们完全没有必要在每一个方法里面都传递这样一个 通用的参数。...
主要介绍了关于ThreadLocal对request和response的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
早在 JDK 1.2 的时代,java.lang.ThreadLocal 就诞生了,它是为了解决多线程并发问题而设计的,只不过设计得有些难用,所以至今没有得到广泛使用。其实它还是挺有用的,不相信的话,我们一起来看看这个例子吧。 一个...
主要介绍了JAVA开发常用类库UUID、Optional、ThreadLocal、TimerTask、Base64使用方法与实例详解,需要的朋友可以参考下
目录SimpleDateFormat诡异bug复现SimpleDateFormat诡异bug字符串日期转...方法时加锁使用ThreadLocalThreadLocal介绍ThreadLocal使用demoThreadLocal源码探索ThreadLocal注意事项使用ThreadLocal解决SimpleDateFormat...
主要介绍了Android 中ThreadLocal的深入理解的相关资料,希望通过本文能帮助到大家,让大家理解应用ThreadLocal,需要的朋友可以参考下
AopLogAopLog是基于SpringAop和ThreadLocal实现的一个对请求方法埋点记录与处理的日志工具包。设计目的和场景:使用Spring Aop拦截程序,基本上都是同一个小异,不想日后每个项目都柏林都写一份这样的Aop拦截处理...
主要介绍了Java ThreadLocal类应用,结合具体案例形式分析了java ThreadLocal类的功能、原理、用法及相关操作注意事项,需要的朋友可以参考下
蓝桥杯leetcode 仓库内容是学习Java时所用的...Thread创建、ThreadLocal用法、Deamon守护线程 CountDownLatch和CyclicBarrier区别 12. LanQiao 蓝桥杯的测试 13. LeetCode 在LeetCode刷的题 14. Test 一些偶尔的测试
ThreadLocal为解决多线程程序的并发问题提供了一种新的思路,ThreadLocal并不是一个Thread,而是Thread的局部变量,本文就来深入解析Java中ThreadLocal线程类的作用和用法.
最好与一些日志框架一起使用。 核心没有任何依赖关系,因此可以位于类加载器层次结构的顶部。 支持 Spring 框架和 Liferay。 用法: Watch watch = ThreadLocalProfiler . start(); ThreadLocalProfiler . ...
synchronized关键字不属于方法特征签名的一部分,所以可以在覆盖方法的时候加上去。...如果在一个类内部都是使用synchronized关键字定义了方法f(),g()。那么当使用这个类的实例调用f()时,就不能再调用g()方法。
希望把jdk常用包使用记录一下,并结合一些常规的工作场景进行探讨,便于以后当工具/模板库使用 synchronized 同步关键字 volatile 关键字 AQS 框架 ReentrantLock 可重入锁 ReentrantReadWriteLock 读写锁 ...
使用数据连结池jdbc连结private static final ThreadLocal<Connection> tl=new ThreadLocal();//泛型为值的类型