volatile关键字和transient关键字

Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量java

1.volatile 关键字-----针对变量的可变性缓存

专业解释:
volatile关键字是个类型修饰符用它声明的类型变量表示能够被某些编译器未知的因素更改,好比:操做系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就再也不进行优化,从而能够提供对特殊地址的稳定访问。安全

实际例子:
发薪资时,会计每次都把员工叫来登记他们的银行卡号;一次会计为了省事,没有即时登记,用了之前登记的银行卡号;恰好一个员工的银行卡丢了,已挂失该银行卡号;从而形成该员工领不到工资
员工 -- 原始变量地址
银行卡号 -- 原始变量在寄存器的备份网络

通俗解释:
使用该关键字的例子以下:
volatile int vint;
当要求使用volatile 声明的变量的值的时候,系统老是从新从它所在的内存读取数据,即便它前面的指令刚刚从该处读取过数据。并且读取的数据马上被保存。-----就是以防这个变量的值会随时改变 每次都是从变量的原始地址取值,不会为了提升效率优化

常使用的地方
一、中断服务程序中修改的供其它程序检测的变量须要加volatile;
二、多任务环境下各任务间共享的标志应该加volatile;
三、存储器映射的硬件寄存器一般也要加volatile说明,由于每次对它的读写均可能有不一样意义;
另外,以上这几种状况常常还要同时考虑数据的完整性(相互关联的几个标志读了一半被打断了重写),在1中能够经过关中断来实现,2 中能够禁止任务调度,3中则只能依靠硬件的良好设计了。spa

2.transient 关键字---针对变量的安全性操作系统

专业解释
transient java语言的关键字,变量修饰符,若是用transient声明一个实例变量,当对象存储时,它的值不须要维持。换句话来讲就是,用transient关键字标记的成员变量不参与序列化过程。线程

通俗解释
若是一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不但愿在网络操做(主要涉及到序列化操做,本地序列化缓存也适用)中被传输,这些信息对应的变量就能够加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。设计

相关文章
相关标签/搜索