java_【volatile】【final】

Volatilev

被volatile修饰的变量能够保证每个线程能够获取该变量的最新值,从而避免出现数据脏读的现象。
(1)实现原理
声明volatile的变量进行写操作VM就会向处理器发送一条Lock前缀的指令
1.Lock前缀的指令会引起处理器缓存写回内存;
2.一个处理器的缓存回写到内存会导致其他处理器的缓存失效;
3.当处理器发现本地缓存失效后,就会从内存中重读该变量数据,即可以获取当前最新值。
(2)内存屏障[阻止指令重排]

Final

原则上:final可以修饰变量,方法和类,用于表示所修饰的内容一旦赋值之后就不会再被改变,比如String类就是一个final类型的类。
1.类变量:必须要在静态初始化块中指定初始值或者声明该类变量时指定初始值,而且只能在这两个地方之一进行指定;
2.实例变量:必要要在非静态初始化块,声明该实例变量或者在构造器中指定初始值,而且只能在这三个地方进行指定。

(1)final局部变量
public void test(final int a){
final int b;
b = 1;
//b=2 报错 fianl修饰的局部变量只能进行一次赋值
}

1.当final修饰基本数据类型变量时,不能对基本数据类型变量重新赋值,因此基本数据类型变量不能被改变。
2.引用类型变量而言,它仅仅保存的是一个引用,final只保证这个引用类型变量所引用的地址不会发生改变,即一直引用这个对象,但这个对象属性是可以改变的。

(2)宏变量

1.使用final修饰符修饰;
2.在定义该final变量时就指定了初始值;
3.该初始值在编译时就能够唯一指定。

(3)方法

1.父类的方法被final修饰的时候,子类不能重写父类的该方法,被final修饰的方法不能够被子类所重写
2.被final修饰的方法是可以重载的。

(4)类

当一个类被final修饰时,表名该类是不能被子类继承的。
不变类
· 使用private和final修饰符来修饰该类的成员变量
· 提供带参的构造器用于初始化类的成员变量;
· 仅为该类的成员变量提供getter方法,不提供setter方法,因为普通方法无法修改fina修饰的成员变量;
· 如果有必要就重写Object类 的hashCode()和equals()方法,应该保证用equals()判断相同的两个对象其Hashcode值也是相等的。
JDK中提供的八个包装类和String类都是不可变类

(5)Final域重排序规则

1.JMM禁止编译器把final域的写重排序到构造函数之外;
2.编译器会在final域写之后,构造函数return之前,插入一个storestore屏障这个屏 障可以禁止处理器把final域的写重排序到构造函数之外。
3.在读一个对象的final域之前,一定会先读这个包含这个final域的对象的引用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值