Java中特殊关键字的用法及效果

transient: 修饰的成员变量不会被序列化(serialization)。

volatile: 提示JVM, 对于这个成员变量不能保存它的私有拷贝,而应直接与主内存中共享成员变量交互。

“一个变量声明为volatile,就意味着这个变量是随时会被其他线程修改的,因此不能将它cache在线程memory中。volatile告诉jvm, 它所修饰的变量不保留拷贝,直接访问主内存中的。Volatile一般情况下不能代替sychronized,因为volatile不能保证操作的原子性,即使只是i++,实际上也是由多个原子操作组成:read i; inc; write i,假如多个线程同时执行i++,volatile只能保证他们操作的i是同一块内存,但依然可能出现写入脏数据的情况。" 
synchronized 可以保证可见性和原子性,volatile只保证了可见性,那就是说sychronized可以实现volatile的作用;

但有时不需要考虑原子性,只需保证可见性时,synchronized 的实现就比较复杂,而volatile就简单明了,这时就体现volatile存在性了;

比如说:判断某个线程是否还需要继续运行(isStop() or isShutdown())。

另外, 使用volatile关键字, 也会触发Java内存模型里happens-before的语义。在volatile变量赋值之前(按代码顺序,出现在此变量赋值前的语句一定先被执行),减少confuse.

Volatile使用的情况:

1.运算结果不需要变量的当前值,或者能够确保只有单一的线程修改变量的值;

2.变量不需要与其他的状态变量共同参与不变约束;


serialVersionUID

如果你的类Serialized存到硬盘上面后,可是后来你却更改了类别的field(增加或减少或改名),当你Deserialize时,就会出现Exception的,这样就会造成不兼容性的问题。 

但当serialVersionUID相同时,它就会将不一样的field以type的预设值Deserialize,可避开不兼容性问题。

发布了48 篇原创文章 · 获赞 1 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章