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,可避开不兼容性问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值