`
JAVA天地
  • 浏览: 673451 次
  • 性别: Icon_minigender_1
  • 来自: 太原
文章分类
社区版块
存档分类
最新评论

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

阅读更多

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

分享到:
评论

相关推荐

    多线程线程变量赋值

    总的来说,“多线程线程变量赋值”是一个关于如何在多线程环境中管理线程私有数据的问题。通过`ThreadLocal`,我们可以创建和操作线程特有的变量,避免了数据同步的复杂性,但在使用过程中需要注意内存管理和线程...

    java多线程_java多线程下变量共享_

    静态成员属于类,所有该类的实例都可以访问,因此在多线程环境下默认共享;实例成员变量则属于对象,每个线程都有自己独立的副本,除非通过某种方式(如传引用)让线程共享同一个对象。 共享变量可能导致的问题主要...

    多线程调试打印日志类

    在多线程环境下,同步机制如互斥锁(mutex)或者条件变量(condition variable)可能会被用来保证日志写入的安全性,防止数据冲突。这确保了即使在高并发情况下,日志也不会出现丢失或错乱。 日志文件的创建和管理...

    面试中多线程问题

    ThreadLocal 为每个使用该变量的线程提供了一个独立的变量副本,每个线程修改副本时不影响其它线程对象的副本。ThreadLocal 实例通常作为静态的私有的字段出现在一个类中,这个类用来关联一个线程。当多个线程访问 ...

    g729a 支持多线程

    在G729A的多线程实现中,通过封装全局变量和静态变量为类成员,可以避免线程间的竞态条件,实现可重入,从而保证多线程环境下的正确运行。 4. **类封装与数据保护**: 将全局变量和静态变量封装进类中,可以通过类...

    posix多线程编程

    在深入探讨POSIX多线程编程的细节之前,我们首先需要理解什么是线程以及为何要在Linux环境下使用pthread库进行多线程编程。 ### 一、何为线程?为何使用线程? 线程是操作系统能够进行运算调度的最小单位,它是...

    多线程栈 源码

    在实现多线程栈时,通常会用到互斥锁(mutex)、条件变量(condition variable)等同步原语来保证线程安全。互斥锁用于保护共享资源,确保在同一时刻只有一个线程能访问栈;条件变量则允许线程等待特定条件满足后再...

    java 多线程编程实战指南(核心 + 设计模式 完整版)

    在Java编程领域,多线程是一项至关重要的技术,它能够充分利用多核处理器的计算能力,提高应用程序的响应速度和并发性能。《Java多线程编程实战指南》这本书深入浅出地讲解了Java多线程的核心概念和实战技巧,分为...

    C# 高效线程安全,解决多线程写txt日志类

    本主题将深入探讨如何在C#中创建一个高效的线程安全日志类,用于在多线程环境中安全地写入txt日志。 首先,我们需要理解线程安全的概念。线程安全意味着当多个线程访问同一段代码时,该代码能正确处理并发操作,...

    VC多线程通讯

    在VC++编程环境中,多线程通信是一个关键的议题,特别是在开发高性能、高并发的应用程序时。多线程技术能够让我们充分利用多核处理器的优势,同时处理多个任务,提高程序的执行效率。本篇将深入探讨VC++中实现多线程...

    C++多线程 最简易的多线程程序

    在C++编程中,多线程是一种常见的技术,它允许程序同时执行多个任务,从而提高程序的并发性和效率。在本“C++多线程 最简易的多线程程序”中,我们将探讨如何使用C++11及更高版本提供的线程库来创建和管理线程。这个...

    netty中的多线程应用

    在处理多个并发连接时,线程局部变量(ThreadLocal)可以用来存储线程私有的数据,避免在多线程环境下的同步问题。 6. **线程池配置** Netty 允许用户自定义 EventLoopGroup 的大小,这直接影响到系统性能。合理...

    易语言线程中的变量应用

    在这个主题“易语言线程中的变量应用”中,我们将探讨如何在多线程环境下使用易语言处理变量,以及涉及的相关函数。 线程是操作系统分配CPU时间的基本单元,它允许程序同时执行多个任务。在易语言中,创建线程通常...

    linux多线程编程.pdf

    Linux 多线程编程是指在 Linux 操作系统中使用多线程技术来提高程序的执行效率和响应速度。多线程编程可以让程序同时执行多个任务,从而提高程序的整体性能。 线程基础知识 什么是线程?线程(Thread)是操作系统...

    多线程编程指南.pdf

    同步对象如互斥锁、信号量、条件变量等,用于解决多线程环境下的数据一致性问题。 - **互斥锁**:是一种简单的同步机制,用于保护共享资源免受并发访问的影响。 - **信号量**:用于控制对有限资源的访问,如打印机...

    JAVA模拟多线程给多用户发送短信

    在本文中,我们将深入了解如何使用JAVA来模拟多线程环境下的短信发送过程。该技术的应用场景在于同时为多个用户发送短信,而且每个短信发送动作是独立于其他发送动作的,这使得我们可以利用并发来提高发送效率。 ...

    多线程程序避免冲突的3条简单规则

    在多线程编程中,确保线程安全是至关重要的,因为并发执行的线程可能会对共享数据产生竞态条件,导致结果不可预测。本篇文章将根据提供的标题“多线程程序避免冲突的3条简单规则”来深入探讨如何在Java环境中有效...

    c++成员函数成为线程函数

    在多线程环境下,类的成员变量可能会被多个线程同时访问,如果不进行同步控制,可能导致数据不一致。为了解决这个问题,可以使用互斥量(`std::mutex`或MFC的`CMutex`)或者临界区(`std::lock_guard`或MFC的`...

Global site tag (gtag.js) - Google Analytics