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

来源:互联网 发布:22端口破解 编辑:程序博客网 时间:2024/06/05 05:14

转自:http://blog.csdn.net/fenglibing/article/details/4076664


情况是这样的,用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的变量副本概念,这样每个线程都会生成自己的副本,不会与其它的线程相关,所以这样可以避免多个线程的访问时,造成当前线程的变更被别的线程给修改了。


转自:http://blog.csdn.net/fenglibing/article/details/4076664