`
ihyperwin
  • 浏览: 438277 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

transient Volatile ThreadLocal

 
阅读更多
Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。  
transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。注意static变量也是可以串行化的



Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到主内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。  
 
Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。  
 
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。  
 
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。  
 
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。  
 
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。  



ThreadLocal是什么

早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。

ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。

当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

从线程的角度看,目标变量就象是线程的本地变量,这也是类名中“Local”所要表达的意思。
分享到:
评论

相关推荐

    leetcode题库-java-interview:Java研发基础相关

    transient 枚举 注解 JDK7新特性 JDK8新特性 JDK9新特性 JDK10新特性 运行时数据区 对象 OOM & SOF 内存模型 垃圾回收算法 垃圾收集器 内存分配与回收策略 类加载 参数优化 进程与线程的区别 进程通信 创建线程的...

    java技术指南

    文档内容分为多个章节,从Java的基本语法开始,详细介绍了关键字的使用,如static、final、transient、volatile、synchronized、import、enum等,这些关键字在Java程序中有着非常重要的作用。例如,static关键字可以...

    2021年Java大厂面试题整理大全

    1. 线程:掌握线程的创建、同步和协作,包括synchronized、volatile、ThreadLocal关键字的用法。 2. Executor框架:理解ExecutorService、ThreadPoolExecutor和Future接口的应用。 3. Lock接口:了解ReentrantLock、...

    Java面试要点(适用于2年以上经验,1年亦可)

    9. 熟悉 Java 中各种关键字:transient、instanceof、volatile、synchronized、final、static、const 集合类 1. ArrayList 和 LinkedList 和 Vector 的区别 2. SynchronizedList 和 Vector 的区别 3. HashMap、...

    Java进阶知识点汇总.pdf

    - **transient**:用于声明变量不参与序列化过程,常用于对象中包含临时状态信息的情况。 - **volatile**:用于修饰共享变量,确保多线程环境中的可见性和有序性,但不保证原子性。 - **synchronized**:用于实现...

    Java装逼指南.pdf

    - **volatile**:用于修饰变量,确保其对所有线程的可见性,并禁止编译器对其优化。适用于状态共享且需保证可见性的场景。 - **synchronized**:用于同步代码块或方法,确保同一时间只有一个线程可以访问。如: ```...

    java面试题,180多页,绝对良心制作,欢迎点评,涵盖各种知识点,排版优美,阅读舒心

    【基础】transient关键字 15 【基础】访问修饰符区别 15 【基础】java基本数据类型(四类八种) 15 Java自动类型转换 16 数据类型自动提升(注意以下讨论的是二元操作符) 16 【基础】switch支持的类型 17 【基础】...

    百度持续交付项目组面试题

    **volatile关键字**用于标记变量的状态,当一个变量被声明为volatile时,任何对该变量的读写操作都直接发生在主存中,因此任何线程对该变量的修改都能被其他线程立即感知。 **线程安全**是指多个线程并发访问同一个...

    JAVA核心知识点整理(有效)

    1. 目录 1. 2. 目录 .........................................................................................................................................................1 JVM ........................

Global site tag (gtag.js) - Google Analytics