Java关键字transient和volatile小结(转)

transient和volatile两个关键字一个用于对象序列化,一个用于线程同步,都是Java中比较高阶的话题,简单总结一下。

transient

transient是类型修饰符,只能用来修饰字段。在对象序列化的过程中,标记为transient的变量不会被序列化。

示例:

class Test {

transient int a; // 不会被持久化

int b; // 持久化

}

当类Test的实例对象被序列化(比如将Test类的实例对象 t 写入硬盘的文本文件t.txt中),变量 a 的内容不会被保存,变量 b 的内容则会被保存。

参考:
把一个对象的表示转化为字节流的过程称为串行化(也称为序列化,serialization),从字节流中把对象重建出来称为反串行化(也称为为反序列化,deserialization)。transient 为不应被串行化的数据提供了一个语言级的标记数据方法。

volatile
volatile 也是变量修饰符,只能用来修饰变量。volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

在此解释一下Java的内存机制:

Java使用一个主内存来保存变量当前值,而每个线程则有其独立的工作内存。线程访问变量的时候会将变量的值拷贝到自己的工作内存中,这样,当线程对自己工作内存中的变量进行操作之后,就造成了工作内存中的变量拷贝的值与主内存中的变量值不同。

Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。

这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。

而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。

使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。

由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。

转载于:https://www.cnblogs.com/qingchen1984/p/3952829.html

Java关键字transient和volatile小结(转)相关推荐

  1. java关键字transient和volatile的基本含义和使用方法

    transient transient关键字为类型修饰符,英文本意为"短暂的",在对象序列化过程中,标记了transient的变量不会被序列化. HashMap中的size属性就标 ...

  2. Java 关键字 transient

    Java 关键字 transient 转载于:https://www.cnblogs.com/fysola/p/6394626.html

  3. JAVA关键字 transient 学习总结

    transient 意义 transient是相对于 类实现了接口 Serilizable 后拥有的意义. 一般类实现了 Serilizable后使得该类对象可以序列化(个人理解 使得对象以及内部属性 ...

  4. java transient 和Volatile关键字

    Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值.而且,当成员变量发生变化时,强迫线程将变化值回写到主内存.这样在任何时刻,两个不同的线程总是看到某个成员变量的同一 ...

  5. Java transient和volatile关键字

    推荐大家去看原文博主的文章,条理清晰阅读方便,转载是为了方便以后个人查阅 https://www.cnblogs.com/heilyeah/p/6594122.html 关键字Volatile Vol ...

  6. 关于java的关键字 transient

    我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,Java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable ...

  7. java input是关键字吗_java 关键字transient

    1. transient的作用及使用方法 我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过 ...

  8. Java实战应用50篇(一)-Java并发编程:volatile关键字解析

    前言 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字 ...

  9. java transient_【转】Java中的关键字 transient

    阅读目录 先解释下Java中的对象序列化 在讨论transient之前,有必要先搞清楚Java中序列化的含义: Java中对象的序列化指的是将对象转换成以字节序列的形式来表示,这些字节序列包含了对象的 ...

最新文章

  1. HDU 1004 Let the Balloon Rise
  2. 数据中心水环热泵余热回收系统分析与应用
  3. pytorch:一维线性回归(二)
  4. 自动化html定位,Selenium自动化定位方法
  5. python数据分析方法和命令_《利用Python进行数据分析》 —— (1)
  6. git 常用commands(转)
  7. Linux 2.6.39-rc3的一个插曲
  8. 树状数组---Squared Permutation
  9. ZR提高失恋测2(9.7)
  10. github 思维导图开元软件_最强大脑!这 7 款开源思维导图工具真的很神奇
  11. hencoder学习自定义view(1)
  12. 怎么做PPT 课件代做 驼峰设计
  13. MyX5TbsPlusDemo【体验腾讯浏览服务Android SDK (TbsPlus 版)】
  14. (六)Ps剪切蒙版/图框
  15. vue3.0脚手架搭建(vscode)
  16. iphone手机可不可以运行java_如何在不启动Xcode的情况下运行iPhone模拟器?
  17. 和el-dialog同级的列表被push数据后for循环渲染失效,列表不更新
  18. 无理数存在性的几何证明
  19. ​继使命召唤飞机表情雨后,如何在微信群聊天中自带表情雨特效,还有使命召唤红包封面...
  20. Android BLE HIDS Data ,从问询DB 到写入Android 节点的flow 之五

热门文章

  1. 港股打新之卖出策略(暗盘和首日)
  2. VNPY - 事件引擎
  3. 房地产企业营销分析系统建设中的关键性指标是什么?
  4. 构建springboot微服务聚合工程
  5. 帆软报表设计器菜单栏介绍之二文件菜单
  6. 简单梳理帆软报表即决策系统的登录步骤 二
  7. 华为推出鸿蒙超级系统,华为鸿蒙系统正式发布!十个人里竟然只有两个人支持?...
  8. 几何分布的期望_超几何分布与二项分布的数学期望
  9. iframe嵌入页面白屏_BFCache 与 浏览器前进后退白屏
  10. 抖音同款表白神器(按钮漂移)