Description: this article is talking about some key words for java
final
当用final修饰一个类,表明整个类不能被继承。
final 类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改,如果是引用数据类型的变量,则在对其初始化之后便不能再让其指向另一个对象
使用final的原因
- 把方法锁定,以防任何继承类修改它的含义
- 效率,在早期的java实现版本中,会讲final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升。在最近的java版本中,不需要使用final方法进行这些优化了
Volatile
是用来保证有序性和可见性的。这个java内存模型有关。
我们所写的代码,不一定按照我们自己书写的顺序来执行的,编译器会做重新排序,CPU会做重新排序,这样的重新排序是为了减少流水线式的阻塞的,比如数据相关性,提高CPU的执行效率。
volatile 变量规则: 对一个变量的写操作先行发生于后面这个变量的读操作;有序性实现的是通过插入内存保障来保证的
可见性: 首先java内存模型分为主内存,工作内存。比如线程A 从主内存把变量从主内存读到了自己的工作内存中,做了加1的操作,但是一次是没有将i的最新值刷新回主内存中,线程b此时读到的还是i的旧值。加了volatile关键字的代码生成的汇编代码发现,会多出一个lock前缀指令。