java volatile 和Transient 关键字
java关键字volatile
volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到主内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。
由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。
java关键字Transient
转自http://horst.sun.blog.163.com/blog/static/348849612007614494492/
翻译自http://www.devx.com/tips/Tip/13726。
Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想
用serialization机制来保存它。为了在一个特定对象的一个域上关闭serialization,可以在这个域前加上关键字transient。
transient是Java语言的关键字,用来表示一个域不是该对象串行化的一部分。当一个对象被串行化的时候,transient型变量的值不包括在串行化的表示中,然而非transient型的变量是被包括进去的。
注意static变量也是可以串行化的
首先,让我们看一些Java serialization的代码:
public class LoggingInfo implements java.io.Serializable
{
private Date loggingDate = new Date();
private String uid;
private transient String pwd;
LoggingInfo(String user, String password)
{
uid = user;
pwd = password;
}
public String toString()
{
String password=null;
if(pwd == null)
{
password = "NOT SET";
}
else
{
password = pwd;
}
return "logon info: \n " + "user: " + uid +
"\n logging date : " + loggingDate.toString() +
"\n password: " + password;
}
}
现在我们创建一个这个类的实例,并且串行化(serialize)它 ,然后将这个串行化对象写如磁盘。
LoggingInfo logInfo = new LoggingInfo("MIKE", "MECHANICS");
System.out.println(logInfo.toString());
try
{
ObjectOutputStream o = new ObjectOutputStream(
new FileOutputStream("logInfo.out"));
o.writeObject(logInfo);
o.close();
}
catch(Exception e) {//deal with exception}
To read the object back, we can write
try
{
ObjectInputStream in =new ObjectInputStream(
new FileInputStream("logInfo.out"));
LoggingInfo logInfo = (LoggingInfo)in.readObject();
System.out.println(logInfo.toString());
}
catch(Exception e) {//deal with exception}
如果我们运行这段代码,我们会注意到从磁盘中读回(read——back (de-serializing))的对象打印password为"NOT SET"。这是当我们定义pwd域为transient时,所期望的正确结果。
现在,让我们来看一下粗心对待transient域可能引起的潜在问题。假设我们修改了类定义,提供给transient域一个默认值,
代码如下:
public class GuestLoggingInfo implements java.io.Serializable
{
private Date loggingDate = new Date();
private String uid;
private transient String pwd;
GuestLoggingInfo()
{
uid = "guest";
pwd = "guest";
} public String toString() { //same as above } } 现在,如果我们穿行化GuestLoggingInfo的一个实例,将它写入磁盘,并且再将它从磁盘中读出,我们仍然看到读回的对象打印password 为 "NOT SET"。当从磁盘中读出某个类的实例时,实际上并不会执行这个类的构造函数, 而是载入了一个该类对象的持久化状态,并将这个状态赋值给该类的另一个对象。
java volatile 和Transient 关键字相关推荐
- Java中的transient关键字
前言 说实话学了一段时间java的朋友对于transient这个关键字依旧很陌生基本没怎么用过,但是transient关键字在java中却起到了不可或缺的地位!如果要说讲到,我觉得最可能出现的地方是I ...
- java中的transient关键字详解
前言 说实话学了一段时间java的朋友对于transient这个关键字依旧很陌生基本没怎么用过,但是transient关键字在java中却起到了不可或缺的地位!如果要说讲到,我觉得最可能出现的地方是I ...
- java volatile 用法_java关键字volatile用法详解
volatile关键字想必大家都不陌生,在java 5之前有着挺大的争议,在java 5之后才逐渐被大家接受,同时作为java的关键字之一,其作用自然是不可小觑的,要知道它是java.util.con ...
- java:volatile,instanceof,strictfp关键字
volatile volatile是一个类型修饰符(type specifier),它是被设计用来修饰被不同线程访问和修改的变量.被volatile类型定义的变量,系统每次用到它时都是直接从对应的内存 ...
- [转载] JAVA中transient 关键字
参考链接: Java中的transient关键字 今天学习到对象流,序列化反序列化的时候,老师用了一个transient关键字来防止某个属性被序列化,脑子一头懵逼,于是在网上看到了找了别人的博客,也不 ...
- java中transient关键字使用学习
导师让我学习序列化和反序列化的时候才意识到自己的对java中的transient关键字不熟.看了很多介绍和学习笔记之后,对transient关键字的使用做一下总结: 如果一个对象只要实现了Serili ...
- Java中transient关键字的详细总结
目录 一.概要介绍 1. 序列化 2. 为什么要用transient关键字? 3. transient的作用 二.transient使用总结 三.使用场景 一.概要介绍 本文要介绍的是Java中的tr ...
- java transient 关键字_Java的transient关键字
一.介绍 Java中的transient关键字,transient是短暂的意思.对于transient 修饰的成员变量,在类实例的序列化处理过程中会被忽略. 因此,transient变量不会贯穿对象的 ...
- Java中不常见的关键字 / 修饰符(volatile , native , transient)
既然是不常见的 , 那public , private , static , final等之类的关键字都不在本次讨论范围之内了 . 如果这几个还不能理解的话 , 不妨重新温习一下Java基础 . 1 ...
- java transient关键字_小伙子,你真的搞懂 transient 关键字了吗?
先解释下什么是序列化 我们的对象并不只是存在内存中,还需要传输网络,或者保存起来下次再加载出来用,所以需要Java序列化技术. Java序列化技术正是将对象转变成一串由二进制字节组成的数组,可以通过将 ...
最新文章
- 8.Spring整合Hibernate_2_声明式的事务管理(Annotation的方式)
- JRBeanCollectionDataSource cannot be resolved to a type 的原因
- hicoder - 1068 【RMQ or 线段树】
- 计算机软件与程序没有任何关系,提示“该文件没有与之关联的程序来执行该操作”怎么解决?...
- H5——while循环,for循环
- 精心挑选的23款美轮美奂的 jQuery 图片特效插件
- 将JSON转成DataSet(DataTable)
- db2取数据库日期时间_DB2数据库取得当前时间的正确解析
- 95-36-210-ChannelHandler-系统Channel-TimeoutHandler
- VScode Remote 直接打开远程服务器目录进行调试
- oracle归档文件管理
- maven安装配置之后mvn命令仍然无效的解决办法
- python编写安装脚本_ido-Python 安装脚本包
- mysql基于amoeba读写分离
- Something‘s wrong--perhaps a missing \item. \begin{thebibliography}{1}
- certificate expired
- MySQL学习2:表的创建和增删改
- 中国石油大学计算机图形学第一次在线作业,北京交通大学《计算机图形学》20秋在线作业1-001答案...
- 黑客搜索大法(Google Hacking)
- 飞控和飞控固件的讲解
热门文章
- Atitit.手机验证码的破解---伪随机数
- Atitit.播放系统规划新版本 and 最近版本回顾 v3 pbf.doc
- Atitit.软件开发的几大规则,法则,与原则p821.doc
- Atitit.软件gui按钮and面板---os区-----linux windows搜索文件 文件夹
- atitit.提升开发效率---mda 软件开发方式的革命--(2)
- paip.提升分词---准确度--常用量词表
- paip.提升安全性---防止敏感文件被下载
- 阿里云郑晓:浅谈GPU虚拟化技术(第二章)
- delphi 如何判断 socket 连接成功_Linux下的C++ socket编程实例
- 【情感识别】基于matlab GUI SVM语音情感识别【含Matlab源码 869期】