私有静态成员变量,在多线程环境,别的线程会修改当前线程的变量值?

情况是这样的,用SOCKET实现了报文接收器,该接收器收到报文后,就调用报文处理线程,而该线程中,要通过反射的机制去调用用户实现的功能,用户实现的功能类是未知道,在配置文件中说明,用户实现的功能类必须要继承一个抽象类,该抽象类规定了用户必须实现的方法,而该抽象类我提供三个方法,两个由我实现,其中就包括可以取到接到的报文,另外一个由用户实现,但用户实现另外一个方法的时候,就需要用到我取得到的报文,所以我要把这个报文在当前线程中可以共享,其它的功能类可以引用该报文做后期的处理。

因为其它的用户需要继承于我写的抽象类,并实现其中的方法即可,他们也需要引用取得的报文,所以这个时候他们必须要可以得到这个报文,但是现在的情况是,我又不操作抽象类,也不可以操作,因为抽象类是不可以实例化,所以我就只有在抽象类中实现取报文的方法,报文要能够共享,我这里就想到采用变量用private static 的形式,然后其GET方法采用默认的,在抽象类就可以采用new 线程类.getMessage();方法去取,这是可行的。我前面采用不用变量定义成静态的,这样去取就取不到值,因为这相当于是重新启了一个类,那肯定就是一切从头了。后面我想,采用JAVABEAN也不一定解决得了问题,因为我不能够往抽象类中传值,所以东西都传不过来呀,如果重新NEW JAVABEAN,也肯定就是空值了。

现在我担心的就是private static定义的静态私有成员变量,会和其它的线程采用同一块存储空间,这样问题就大了,我在网上搜索了大半天也没有找到这个结果,看什么时候解决,或者是可以想一个比较完美的解决方案,不采用静态变量

状态:解决

解决方式,采用ThreadLocal实现,可参见此处:http://blog.csdn.net/fenglibing/archive/2009/04/15/4076885.aspx了解其详细说明及实例。

我解决方式如下:

//当前类:MsgListener
//需要给其它类访问的变量定义
private static String coreMessage;
//通过ThreadLocal设值:
threadLocal.set(message);
//下面为ThreadLocal设值与取值的实现
private static ThreadLocal threadLocal=new ThreadLocal(){
public synchronized Object get()
{
return coreMessage;
}
public synchronized void set(Object coreMessage)
{
MsgListener.coreMessage=(String)coreMessage;
}
};
//该方法提供给其它的类调用
public static String getCoreMessage() {
return (String)threadLocal.get();
}
其它类中调用就简单了:
MsgListener.getCoreMessage();

这里采用ThreadLocal的变量副本概念,这样每个线程都会生成自己的副本,不会与其它的线程相关,所以这样可以避免多个线程的访问时,造成当前线程的变更被别的线程给修改了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值