`
yourenyouyu2008
  • 浏览: 282098 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ThreadLocal的用法

阅读更多

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会导致并发问题,两个并发的线程可能取到对方的值。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics