`
desert3
  • 浏览: 2139510 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
社区版块
存档分类
最新评论

java静态类、静态方法、静态变量、实例变量、线程本地变量、静态线程本地变量

    博客分类:
  • Java
阅读更多
静态类:
只有嵌套类才能被声明为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
分享到:
评论

相关推荐

    C++非静态成员函数完全可以作为线程函数

    一般地,线程要读写类的私有成员变量,只有两种方法:将全局函数声明为类友元friend,或者使用静态的成员函数static。那非静态的成员函数呢?一般地方都说的是,不行,做不了。。。为什么不行?都是代码区的代码,...

    Qt 多线程访问同一个变量

    1.Qt下,多线程使用互斥锁安全访问同一全局变量;2.源码中定义了ThreadA和ThreadB,定义变量后,依次调用函数start()来启动重写的run()函数

    java线程详解

    Java线程:新特征-条件变量 Java线程:新特征-原子量 Java线程:新特征-障碍器 Java线程:深入ThreadLocal 一、标准例子 二、不用ThreadLocal 三、自己实现个ThreadLocal 四、透过现象看本质 Java线程:大...

    Java开发技术大全(500个源代码).

    differ.java 测试静态方法与实例方法之间的区别 forefather.java 一个简单的基类 grandson.java 上面这个类的子类 hasConstructor.java 拥有构造器的类 hasFinalFun.java 拥有最终方法的类 hasRecall.java ...

    JAVA笔记.zip

    不能访问实例成员 "&gt; 静态变量 实例化前初始化 类装载时分配空间 多个对象共享同一内存空间 不能被垃圾收集线程收集 静态代码块 装载时运行 在main 之前 只运行一次 下次类再装载或创建对象时不运行 静态...

    java编程基础,应用与实例

    5.6 静态变量与静态方法 70 5.7 成员与静态方法的关系 71 5.8 包与导入 72 5.9 访问控制符 74 5.10 重载 77 5.11 构造函数 79 5.12 类的初始化 83 5.12.1 静态块 84 5.12.2 实例块 84 5.13 巩固...

    java范例开发大全

    实例154 使用静态成员变量计算内存中实例化的对象数目 239 实例155 实现加减乘除的方法 240 8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会(工厂...

    20道JAVA面试题.docx

    4、Java中的静态变量和实例变量有什么区别? 5、Java中的重载和重写有什么区别? 6、Java中的抽象类和接口有什么区别? 7、Java中的线程是什么? 8、Java中的synchronized关键字有什么作用? 9、Java中的异常是什么...

    JAVA 范例大全 光盘 资源

    实例28 静态内部类 70 实例29 成员内部类 71 实例30 局部内部类 73 实例31 单例模式(Singleton) 75 实例33 开车(简单工厂模式) 77 实例33 旅游(工厂方法模式) 79 实例34 花园布局(抽象工厂模式) 80 ...

    多线程实现的Java爬虫程序

    以下是一个Java爬虫程序,它能从指定主页开始,按照指定的深度抓取该站点域名下的网页并维护简单索引。  参数:private static int...  本程序用到了多线程(静态变量和同步),泛型,文件操作,URL类和连接,Hashtabl

    Java范例开发大全(全书源程序)

    实例154 使用静态成员变量计算内存中实例化的对象数目 239 实例155 实现加减乘除的方法 240 8.3 面向对象的设计模式 241 实例156 Singleton单例模式 242 实例157 招聘(简单工厂模式) 243 实例158 同学聚会...

    Java常见面试题整理出来了

    ⑥抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,但接口中定义的变量只能是public static 类型,并且默认为 public static 类型。 ⑦一个类可以实现多个接口,但只能继承一个...

    java 面试题 总结

    派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。 3.封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即...

    java初学者必看

    最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,...

    JAVA面试题最全集

    静态变量和静态方法的意义,如何引用一个类的静态变量或者静态方法? 50.JAVA语言如何进行异常处理,关键字:thorws,throw,try,catch,finally 51.Object类(或者其子类)的finalize()方法在什么情况下被调用? 52....

    java范例开发大全源代码

     实例154 使用静态成员变量计算内存中实例化的对象数目 239  实例155 实现加减乘除的方法 240  8.3 面向对象的设计模式 241  实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  ...

    Java范例开发大全 (源程序)

     实例154 使用静态成员变量计算内存中实例化的对象数目 239  实例155 实现加减乘除的方法 240  8.3 面向对象的设计模式 241  实例156 Singleton单例模式 242  实例157 招聘(简单工厂模式) 243  实例158...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    11.3.11 静态方法——类范围里的概念 312 11.3.12 静态方法何以为“静态” 314 11.4 变量的修饰符 316 11.4.1 变量方法皆成员 317 11.4.2 变量的访问控制符 317 11.4.3 使用private修饰类的成员变量 318 ...

Global site tag (gtag.js) - Google Analytics