多线程的同步,相信很多开发者都很熟悉,特别是线程之间的同步,更是让人记忆犹新。
在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作(机器是32位处理单元,这两个是8个字节表示的,也就是是64位)。这在 JVM 1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要。在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。
在实际工作中很少有用到volatile这个关键字
线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B。只在某些动作时才进行A和B的同步。因此存在A和B不一致的情况。volatile就是用来避免这种情况的。volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的(也就是上面说的A)
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。
Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。
transient
把一个对象的表示转化为字节流的过程称为串行化serialization,从字节流中把对象重建出来称为反串行化deserialization,transient 为不应被串行化的数据提供了一个语言级的标记数据方法。
对象的序列化(serialization)非常影响I/O的性能,尽量少用。对不需序列化的类的域使用transient关键字,以减少序列化的数据量。同时一定意义上隐藏了类的结构,使得信息更加安全。对于一些orm框架,就可以不必对该字段进行数据的保存。
顺便说一下,在hibernate对象的生命周期里,状态为transient状态的对象随时都可以被垃圾回收器回收。
volatile只保证从主存加载数据时是线程互斥的,但是不保证多线程的并发修改。
相关推荐
1. **table**: `transient volatile Node,V>[] table` 是存储Node的数组,作为ConcurrentHashMap的数据容器。采用懒加载,首次插入数据时初始化,数组大小为2的幂次方。 2. **nextTable**: `transient volatile Node...
2. **数组volatile修饰**:`transient volatile Node,V>[] table`,这里的`volatile`修饰符保证了数组`table`在扩容时对其他线程也保持可见性,即一旦数组`table`被更新,所有线程都能立即看到最新的状态。...
transient Entry,V>[] table = (Entry,V>[]) EMPTY_TABLE; 这个数组,那么它又是如何定义的呢? Entry 是 HashMap 中的一个内部类,从他的成员变量很容易看出: key 就是写入时的键。 value 自然就是值。 开始...
### Java中的transient关键字详解 在Java编程语言中,`transient`关键字是一个非常重要的概念,主要用于对象序列...同时,理解`transient`与`volatile`之间的区别也是处理复杂Java应用中的多线程和序列化问题的关键。
transient volatile java运算符 操作符 含义 算数运算符 + – * / % ++ – 赋值运算符 = 关系运算符 == != > = <= & 对应位都是1,则结果为1,否则为0 | 对应位都是0,则结果为0,否则为1 ...
声明了一个私有的、瞬态的、volatile 字段,而 protected transient volatile int protectedTransientVolatileIntMemberField; 声明了一个保护的、瞬态的、volatile 字段。public transient volatile int ...
native,transient,volatile,strictfp,CMM,synchronized,java socket,压缩与解压缩,多线程,垃圾回收算法,JVM ClassLoader,IO流,反射机制,JNDI, GUI布局管理器,JMS, Java Mail, JNDI reference,java事件处理...
1. **关键字 transient 和 volatile**: - `transient` 是Java的关键字,用于标记字段,表明该字段的值不会在序列化过程中被持久化。这意味着当对象被序列化后,被`transient`修饰的变量将不会包含在序列化的表示中...
另一方面,transient关键字用于标记一个成员变量,表示该变量不应被序列化,即不会被保存在持久化存储中。 volatile关键字在多线程环境中至关重要。在Java内存模型中,线程可以有自己的工作内存副本,可能导致数据...
其中,修饰符可以是static、final、transient、volatile等,类型是变量的数据类型,变量名是变量的名称,初始值是变量的默认值。 成员变量的修饰符有四种:static、final、transient、volatile。static表示成员变量...
* 变量声明格式:[public | protected | private] [static] [final] [transient] [volatile] 变量数据类型 变量名 1 [= 变量初值 ], 变量名 2 [= 变量初值 ], … ; * 访问控制符:public、protected、private * 变量...
Java提供了10种基本修饰符,它们分别是`public`、`protected`、`private`、`final`、`abstract`、`static`、`native`、`transient`、`synchronized`和`volatile`。这些修饰符的应用范围和功能各不相同,下面将逐一...
但是,需要注意的是,序列化可能会暴露对象的私有数据,因此在设计可序列化类时,应谨慎处理敏感信息,可能需要使用`transient`或`volatile`关键字来排除不想序列化的成员变量。 `transient`关键字用于标记一个字段...
本文将对几个常见的Java修饰符进行详细介绍,包括`public`、`private`、`protected`以及一些其他修饰符如`abstract`、`final`、`static`、`volatile`和`transient`等。 #### 1. `public` `public`修饰符是最常用的...
域修饰符有public、protected、private、static、transient、volatile、final七个。 1. public:公共的,可以从所有的类中访问。 2. protected:保护的,只能从自己的类和它的子类中访问。 3. private:私有的,...
transient与volatile关键字的理解 - **transient**:此关键字用于标记一个对象中的字段,在序列化时该字段会被忽略,即不会被持久化到磁盘或网络传输中。例如,在一个类`T`中,如果`a`字段被声明为`transient`,则...
- 当多个线程访问同一volatile字段时,无需使用synchronized,但仍需注意并发问题。 11. **transient**: - `transient`修饰的字段不会被序列化,不作为对象持久状态的一部分。 - 当对象需要持久化或在网络中...
1. **`transient` 和 `volatile` 关键字**: - `transient` 关键字用于标记一个实例变量,表明该变量在序列化时不应被持久化。这意味着当对象被序列化并存储到持久化存储中时,`transient`修饰的变量不会被保存,而...
Java 语言中有多种修饰词,总共定义了 11 种,包括 public、protected、private、abstract、static、final、native、strictfp、synchronized、volatile 和 transient。这些修饰词可以应用于类、接口、成员、方法、...