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

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

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

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

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

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

2.transient 关键字---针对变量的安全性

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

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

最新文章

  1. mysql想要别人远程能连接
  2. iis中限制访问某个文件或某个类型的文件配置方法
  3. HDU 4341 分组背包
  4. (转)面向移动设备的HTML5开发框架
  5. Kali-linux安装之后的简单设置
  6. MyBatis(3.2.3) - Handling enumeration types
  7. rsync+inotify实现数据的实时备份
  8. Flag
  9. 三、糖醋鲤鱼(Sweet and sour carp)
  10. python3百度设置高级搜索例子
  11. [ZJOI2018]胖
  12. 从零开始搭建django前后端分离项目 系列三(实战之异步任务执行)
  13. Light OJ 1007
  14. iOS开发-UIImageView高效设置Radius
  15. js时间加减
  16. [iOS]@synthesize和@dynamic关键字
  17. MySQL存储过程的异常处理
  18. 「Vue」实用组件
  19. VC++的全局变量(转)
  20. Go基础---->go的基础学习(二)

热门文章

  1. eureka 服务实例实现快速下线快速感知快速刷新配置解析
  2. 邻居子系统 之 邻居项创建__neigh_create
  3. python:网络爬虫的学习笔记
  4. AttributeError:module 'keras.engine.topology' has no attribute 'load_weights_from_hdf5_group_by_name
  5. Mysql general_log 日志详解
  6. 在sed中引入shell变量的四种方法
  7. SQL Server 数据库设计、命名、编码规范
  8. Android Stuido中断点调试和高级调试
  9. 日志框架之Logger
  10. linux添加用户所在群组