transient和volatile两个关键字一个用于对象序列化,一个用于线程同步,都是Java中比较高阶的话题,简单总结一下。
transient
transient是类型修饰符,只能用来修饰字段。在对象序列化的过程中,标记为transient的变量不会被序列化。
示例:
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中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。
自己在看apache common collections LRUMap时,看到的AbstractLinkedMap 里用到的。自己也重新记忆一下。
转载:http://heaven-arch.iteye.com/blog/1160693
相关推荐
在Java编程语言中,`transient`关键字与对象的序列化(serialization)机制密切相关,它在处理对象状态的持久化时扮演着关键角色。本文将深入探讨`transient`关键字的功能、用途以及它如何影响Java对象的序列化过程。 ...
在Java编程语言中,`transient`是一个非常重要的关键字,它与对象持久化和序列化密切相关。当一个字段被声明为`transient`时,它表明该字段的值不会随着对象的序列化而保存。这通常用于那些不希望或者不需要在序列化...
#### 与volatile关键字的区别 另一个经常与`transient`关键字混淆的是`volatile`关键字。虽然两者都与变量的可见性和状态有关,但它们的作用机制完全不同。 - `transient`用于序列化过程,决定哪些变量不应被持久...
需要注意的是,虽然像`const`和`goto`这样的关键字在Java中并未使用,但在某些情况下仍被视为保留字。此外,诸如`true`、`false`和`null`虽然不是关键字,但在Java中有着特殊的意义,不应将它们用作标识符。
在Java编程语言中,`transient`是一个非常重要的关键字,它与对象的序列化息息相关。序列化是将一个对象的状态转换为字节流的过程,这样就可以存储或在网络中传输。当我们标记一个字段为`transient`时,意味着该字段...
Java是一种广泛使用的面向对象的编程语言,其...这些关键字是Java语言的基础,理解它们的含义和用法对于编写高质量的Java代码至关重要。通过深入学习和实践,开发者可以更好地掌握Java的精髓,提高编程效率和代码质量。
因此,transient 关键字是 Java 编程中一个非常重要的概念,每个 Java 开发者都应该了解和掌握它。 需要注意的是,transient 关键字只是告诉 JVM 不要序列化被标记的属性,但它并不能保证这些属性的安全性。如果...
在给定的文件列表中,除了与`transient`关键字相关的`Java之transient关键字.md`文件,其他如`javaweb\Tomcat.md`、`javaweb\Cookie、Session、localStorage、sessionStorage区别和用法.md`等文件可能涉及Web开发中...
Java的关键字是构成Java程序的基础元素之一,正确理解和运用这些关键字对于编写高质量的Java程序至关重要。每个关键字都有其特定的用途和语法规则,熟悉它们可以帮助开发者更好地控制程序的行为和逻辑结构。
Java关键字和命名规范是Java编程语言中的基础概念,它们对于编写清晰、规范的代码至关重要。Java关键字是Java语言内置的、具有特殊用途的保留字,而命名规范则是关于如何给类、方法、变量等命名的约定。 ### Java...
Java关键字是编程的基础,它们是Java语言预定义的标识符,具有特殊含义并被Java编译器识别。在Java中,一共有51个关键字(包括保留字),但描述中提到的是48个,可能是因为某些关键字在特定上下文不常用或者被归类到...
Java 共有 50 多个关键字,它们包括但不限于 `abstract`、`assert`、`boolean`、`break`、`byte`、`case`、`catch`、`char`、`class`、`const`(虽然未使用)、`continue`、`default`、`do`、`double`、`else`、`...
Java语言中的关键字是编程的基础,它们是被Java解析器预定义并赋予特殊含义的词汇,用于控制程序的流程、内存管理、对象交互等关键功能。下面是对Java关键字的详细解释: 1. `abstract`: 用于定义抽象类或抽象方法...
### Java关键字详解 #### 前言 Java作为一种广泛使用的编程语言,在软件开发领域占据了重要的地位。Java的关键字,即保留字,是Java语言中具有特殊意义的...希望本文的介绍能帮助读者更好地理解和运用Java的关键字。
Java关键字是编程的基础,它们是Java语言预定义的、具有特殊含义的标识符,不能作为变量名、方法名或类名。...通过深入学习和实践,开发者能够更好地理解和利用Java的关键字来构建复杂的应用程序。
对于新手来说,理解Java的关键字是非常重要的一步,因为它们构成了语言的基础并指导了代码的结构和行为。 Java的关键字是被语言本身保留的词汇,它们有特定的含义和功能。例如,`byte`, `short`, `int`, `long`, `...
- 其他关键字:如void、static、final、abstract、native、transient、volatile等,各有特定用途。 2. Java关键字应用示例: - `public class HelloWorld {` 这行代码定义了一个公共类HelloWorld,可供其他类访问...
"Java关键字与标识符小结" Java语言中,关键字和标识符是两个重要的概念。关键字是被Java语言赋予了特殊含义的单词,总共有50个。它们被用来定义数据类型、流程控制、访问权限修饰符、类、函数、变量修饰符、类之间...
在Java编程语言中,`transient`关键字是一个非常重要的概念,它与对象的序列化过程紧密相关。序列化是将一个对象的状态转换为字节流,以便存储或在网络中传输。当一个类实现了`Serializable`接口,该类的对象就可以...