读AbstractMap.java中的源码时,遇到transient volatile 突然忘记了:
transient volatile Set<K> keySet = null;
transient volatile Collection<V> values = null;
解析:
关于volatile:
在虚拟机的实现中,int char等基本类型是一个字长,而long double是两个字长。某些虚拟机的实现中,long的两个字长可能被作为两个原子性的单字长来操作。
如果不以volatile修饰double long,如果多线程访问该变量,由于long操作的整体非原子性而导致结果混乱。
比如:int,一个线程写入4,另一个写入5. 最后肯定是4或者5.而 long型,可能就是个乱七八糟的数值了。
另外如果用 synchronized 则不存在这样的问题了。
volatile变量,一般在多任务多线程情况下使用。
volatile修饰的变量,表明该变量会有不可预知的改变,该变量会被意想不到的改变。精确的说,jvm每次解析到这个变量时,会小心翼翼的读取它,会从主存中读取,而不会直接从寄存器里读取它的拷贝。
关于transient :
如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。
transient修饰的变量,不进行序列化。
摘要:
我们知道,在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有必要进行同步。
这在JVM 1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下
volatile关键字的使用变得非常重要。在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行
读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。要解决这个问题,只需
要像在本程序中的这样,把该变量声明为volatile(不稳定的)即可,这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。一般说
来,多任务环境下各任务间共享的标志都应该加volatile修饰。
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。
摘要transient:
Transient
Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。
Transient 也是java中的保留字,Java有个特点就是序列化,简单地来说就是可以将这个类存储在物理空间(当然还是以文件的形式存在),那么当你从本地还原这个文件时,你可以将它转换为它本身。这可以极大地方便程序中操作,但同时,因为涉及到安全问题,所以并不希望把类里面所有的属性都能存储(因为那样,别人可以通过序列化知道类里面的内容),那么我们就可以用上transient这个关键字,它的意思是临时的,即不会随类一起序列化到本地,所以当还原后,这个关键字定义的变量也就不再存在。
分享到:
相关推荐
49. `volatile` - 用于共享变量,保证多线程环境下的可见性和一致性。 50. `while` - 循环控制结构。 接下来,我们关注Java中的3个基本直接量类型: 1. **数值直接量**:这些是直接表示数值的常量,包括整型(如...
46. `transient`:非持久化修饰符,忽略变量在序列化过程中的存储。 47. `try`:异常处理的开始,包含可能会抛出异常的代码。 48. `void`:声明无返回值的方法。 49. `volatile`:确保多线程环境下变量的可见性和...
或者防止类或方法被重写abstract用于声明抽象方法或抽象类synchronized使方法或代码块同步,确保同一时间只有一个线程执行volatile保证多线程环境中的变量可见性和有序性transient不保存在序列化状态中,用于标记...
transient Entry,V>[] table = (Entry,V>[]) EMPTY_TABLE; 这个数组,那么它又是如何定义的呢? Entry 是 HashMap 中的一个内部类,从他的成员变量很容易看出: key 就是写入时的键。 value 自然就是值。 开始...
- `volatile`:用于标记变量的状态,确保线程可见性。 - `while`:启动一个while循环。 #### 保留关键字(Reserved Word) 保留关键字是指Java语言目前尚未使用但已被预留出来以备将来扩展的关键字。尽管它们现在...
47. `volatile`: 修饰符,确保多线程环境下的可见性和不被优化,保证变量在不同线程间的一致性。 48. `while`: 创建while循环,当条件为真时持续执行循环体。 这些关键字是构建Java程序的基础,理解并熟练运用它们...
- `volatile` 关键字用于确保多线程环境中的变量可见性和有序性。 48. `while`: - `while` 循环在条件满足时重复执行代码块。 以上是Java关键字的全面总结,它们在编写Java程序时扮演着至关重要的角色,帮助...
在序列化过程中,被`transient`修饰的变量不会被写入序列化流中,而在反序列化过程中也不会对其进行初始化。 #### Try `try` 块用于包含可能抛出异常的代码。通常与`catch`和/或`finally`块一起使用,以便在异常...
在Java编程语言中,修饰符是用来限制或指定代码元素(如类、方法、变量)的访问权限、特性或行为的关键词。以下是对标题和描述中提及的Java修饰符及其相关知识点的详细介绍: 1. 类的访问控制修饰符: - **public*...
包括abstract、boolean、break、byte、case、catch、char、class、const、continue、default、do、double、else、extends、final、finally、...、throw、throws、transient、try、void、volatile等52个关键字...
1. transient 和 volatile 是 Java 关键字吗? 2. 抽象类和接口有什么区别? 3. 能说一下 Java 的反射机制吗? 4. 在 Java 中怎样实现多线程? 5. 你用过哪种设计模式? 6. 请说一下 MVC 架构。 7. 如果类 a 继承类 ...
在编程语言中,修饰符是用于定义类、接口、变量和方法等元素特性的关键词或标识符。在Java中,修饰符起着至关重要的作用,它们帮助开发者控制代码的访问级别、实现多态性以及规范类和方法的行为。本文将深入探讨Java...
包括abstract、boolean、break、byte、case、catch、char、class、const、continue、default、do、double、else、extends、final、finally、...this、throw、throws、transient、try、void、volatile、while等...
- `native`、`strictfp`、`transient`、`volatile`、`assert` 了解并正确使用这些关键字是Java编程的基础之一,有助于编写出结构清晰、逻辑严谨的高质量代码。此外,熟悉关键字还可以帮助开发者更高效地理解和维护...
`native`表示方法由非Java代码实现,`assert`用于断言,`transient`和`volatile`则与序列化和内存可见性相关。 Java的注释有三种形式:单行注释`//`,多行注释`/* ... */`,以及Javadoc注释`/** ... */`,它们用于...
48. `volatile`:声明共享变量,确保多线程环境下的一致性。 49. `while`:创建while循环。 Java的保留字包括: 1. `const`:虽然在Java中未被使用,但仍然保留,以防未来版本中可能引入。 2. `goto`:在Java中不...
`throws`, `instanceof`, `transient`, `volatile`, `interface`, `package`, `import`, `enum`, `default`, `assert` 等,它们都在构建 Java 程序时起着不可或缺的作用。理解和熟练掌握这些关键字是成为一个优秀的...
关键词是Java语言的基石,它们具有特殊的含义,用于构建程序结构。以下是一些重要的Java关键字及其解释: 1. **访问控制**: - `private`:表示私有,只允许在同一个类内部访问。 - `protected`:受保护的,允许...
`switch`, `synchronized`, `this`, `throw`, `throws`, `transient`, `true`, `try`, `Void`, `volatile`, `while`。这些关键字不能随意使用,它们在程序中有特定的用途,如控制流程、声明变量或类等。 保留字则...
宣告变量名称的同时,加上“final”关键词来限定,这个变量一但指定了值,就不可以再改变它的值 如:final int n1= 10; n1=20; 这就会报错 输出命令: System.out.println() 会自动换行的打印 System.out....