静态类:
只有嵌套类才能被声明为static类。一般顶级类不能被声明为static类,可以有static变量、方法。
静态方法:
不需要实例化类就能访问类的静态方法。
静态变量、实例变量:
静态变量(又名类变量)在
内存中只有一个,java虚拟机
在加载类的过程中为静态变量分配内存,静态变量位于方法区,
被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。
实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。
线程本地变量:
提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为
访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。
分析:
ThreadLocal是一个类,而且是java.lang下的,所以可以直接使用,而不用专门去import。
ThreadLocal类里有一个map结构,这个map的key是Thread对象,而value则是Object类型。这就是说,我们可以利用这个map存储任何对象。ThreadLocal提供了,set(Object o)和get()方法。set(Object o)用于往自己的map结构类添加对象,而get()则是从map中取对象。那么为什么没有key这个参数呢,set(Object o)和get()方法,为key这样赋值,
key = Thread.CurrentThred()。所以set(Object object)和get()方法都没有key这个参数。这种机制保证了每个当前线程都可以有自己的一个key-value的值对存储在ThreadLocal中。
静态线程本地变量:
和一般的静态变量一样,在内存中只有一个。它和实例线程本地变量具有相同的行为。但是实例线程本地变量不能被静态方法访问,而静态线程本地变量可以被静态方法访问!
非静态线程本地变量对应Per Thread - Per Instance,静态线程本地变量对应:Per Thread。
singleton单例Class中的非静态线程本地变量的效果 = 非单例Class中的静态线程本地变量。本质上,在内存中都只存在一个变量,这个变量里面为每个关联的线程保存一份相互独立的值(每个线程都有自己的一份实例值【T 的实例】,并且线程之间的值相互独立)。
例子:
static ThreadLocal<Integer> myThreadLocal = new ThreadLocal<Integer>();
上面的代码会产生一个静态、引用型变量myThreadLocal,但是会有很多Integer实例,每个实例关联到一个访问这个静态变量的线程。实际上,看起来就是一个特殊的静态变量,里面对每个线程都保存一个指定类型的实例变量。
ThreadLocal variable and static TL variable
分享到:
相关推荐
Java 中的静态变量、静态方法、静态块和静态类 Java 中的静态变量、静态方法、静态块和静态类是 Java 编程语言的四个重要概念,它们之间存在着紧密的关系。下面将对这四个概念进行详细的介绍。 一、静态变量...
在Java中,线程共享变量可以通过两种方式实现:静态成员变量和实例成员变量。静态成员属于类,所有该类的实例都可以访问,因此在多线程环境下默认共享;实例成员变量则属于对象,每个线程都有自己独立的副本,除非...
3. **静态类**:静态类,也称为工具类,通常包含静态方法和静态变量。它们不能包含非静态成员,也不能被实例化。静态类中的方法可以通过类名直接调用,无需创建对象。 类中的方法也有多种类型: 1. **私有方法**...
在Java中实现单例模式时,静态变量通常用于保存类的唯一实例。示例代码如下: ```java public class Singleton { private static Singleton instance; private Singleton() {} public static Singleton ...
- **访问性**:可以不通过类的实例直接访问静态变量,使用`类名::静态变量名`的方式。 - **生命周期**:静态变量的生命周期从类加载到内存时开始,到程序结束时才释放,因此在整个程序运行期间都可被访问。 - **...
在Java编程语言中,"静态"(static)关键字是一个非常重要的概念,它具有多种用途,包括定义静态变量、静态方法、静态初始化块以及静态类。理解这些概念对于编写高效的Java代码至关重要。 首先,我们来解释静态变量...
实例方法则可以访问类变量和实例变量,可以操作对象的状态。方法重载允许在同一类中定义多个同名但参数不同的方法。 返回类型指定了方法执行后返回的数据类型,如果方法不返回任何值,应声明为`void`。方法中的变量...
Java中的`static`关键字是用来声明静态变量或静态方法的,它是面向对象编程中非常关键的一个概念。静态变量属于类,而不是类的实例,这意味着它们在内存中只有一份拷贝,所有的类实例共享这个相同的变量。当我们声明...
静态变量在其他面向对象的语言如Java或C#中比较常见,但在Python中,由于其动态特性的存在,实现静态变量的方式稍有不同。本篇文章将详细介绍在Python中如何在类和函数中使用静态变量,并通过三个示例来说明。 **...
在Java编程语言中,`static`关键字是用来声明静态变量和静态方法的,这些成员属于类本身,而不属于类的任何实例。静态变量,也被称为类变量,是存储在内存的类区域,而实例变量则是存储在堆内存中,每个对象实例都有...
标题"Qt 多线程访问同一个变量"涉及到的是如何在多线程环境下确保对共享资源(此处为一个全局变量)的安全访问。描述中提到了使用互斥锁来解决这个问题,并通过创建两个线程ThreadA和ThreadB来演示这一过程。 首先...
例如,如果局部变量引用了非线程安全的对象(如全局变量、静态变量或者共享资源),或者通过某种方式(如闭包)使得局部变量的生命周期超出了其定义的代码块,那么就可能出现线程安全问题。因此,即使变量本身是局部...
2. **存储区域**:静态变量存储在Java的静态存储区,这意味着所有类的实例共享同一份静态变量的拷贝。因此,它们是线程安全的,因为它们不是每个线程都有一份副本。 3. **生命周期**:静态变量在程序启动时被创建,...
下面我们将深入探讨静态方法、静态变量以及静态类等相关的知识点。 1. 静态方法 静态方法是与类关联,而不是与类的实例关联的方法。这意味着我们不需要创建类的实例就可以调用静态方法。它们在内存中只有一份,且在...
条件变量(如java.util.concurrent.Condition)则允许线程在满足特定条件时才能继续执行,提高了线程的协调能力。 总的来说,Java多线程提供了强大的工具和机制,帮助开发者构建高效、响应迅速的应用程序。理解并...
同步是确保多线程之间正确协调执行的一种方法,确保对共享资源的访问是有序的。常见的同步原语有锁(Mutex)、信号量(Semaphore)、条件变量(Condition Variable)等。在C++中,可以使用`std::mutex`来实现互斥锁...
本实例通过具体的代码展示了两种创建Java线程的方法,并对其中的关键概念进行了详细介绍。通过对比两种线程创建方式的结果,可以看出不同创建方式的特点及其适用场景。同时,对`start()`方法和中断相关的三个方法...
在示例的`sort`类中,我们看到静态变量`i`在未初始化时默认为0,通过类名直接访问并修改其值,然后在实例化类时通过构造函数再次初始化,展示了静态变量的特性。 静态变量和静态方法在多线程环境中需要特别注意,...
一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,...