理解 java volatile,transient关键字
来源:互联网 发布:德哈维兰 知乎 编辑:程序博客网 时间:2024/06/03 08:07
一、volatile
一般在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有必要进行同步。这在JVM 1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要。在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。要解决这个问题,只需要像在本程序中的这样,把该变量声明为volatile(不稳定的)即可,这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。一般说来,多任务环境下各任务间共享的标志都应该加volatile修饰。
Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。
总之,java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。
使用建议:
1)一旦变量被transient修饰,变量将不再是对象持久化的一部分,该变量内容在序列化后无法获得访问。
2)transient关键字只能修饰变量,而不能修饰方法和类。注意,本地变量是不能被transient关键字修饰的。变量如果是用户自定义类变量,则该类需要实现Serializable接口。
3)被transient关键字修饰的变量不再能被序列化,一个静态变量不管是否被transient修饰,均不能被序列化。
- 理解 java volatile,transient关键字
- Java Volatile transient 关键字
- Java transient、volatile关键字
- Java transient Volatile关键字
- Java Volatile transient关键字
- Java Volatile transient关键字
- Java Volatile transient 关键字
- Java transient Volatile关键字
- Java transient Volatile关键字
- Java transient,Volatile关键字
- Java volatile transient关键字
- java关键字Volatile Transient
- Java Volatile transient 关键字
- 对于java关键字volatile,和transient 的理解
- Java 关键字:strictfp volatile transient
- Java关键字transient和volatile
- java 关键字: volatile、strictfp、transient
- java关键字Transient 和 Volatile
- 杭电ACM5512
- IOS8 AutoLayout和size classes 详解
- iOS自定义控件的问题及解决方法
- Android Studio 快捷键
- 微信开发学习总结-3
- 理解 java volatile,transient关键字
- cmd的命令不能使用解决方法
- startActivityForResult用法详解及实例
- 循环链表
- CAGradientLayer处理颜色渐变效果
- EventBus基础教程解析,一分钟学会EventBus的使用
- Linux查看开机运行时间的多种方法
- 正则化方法:L1和L2 regularization、数据集扩增、dropout
- swift-tableView 代理方法实现点击按钮删除效果