final关键字
修饰类对象、方法、局部变量、成员变量、基本类型、引用类型上效果都不一样
- final修饰的类,不可被继承,比如String类
- final修饰的方法,不能被子类重写覆盖,比如ClassLoader.findLoadedClass()就是final的
- final修饰的静态成员变量,也叫常量,比如常量工具类
- final修饰成员变量的时候,在申明的时候就必须赋值
- final修饰局部变量的时候,可以在使用的时候再进行赋值
- final的赋值是基本类型的时候,一旦赋值就不能修改
- final的赋值是其它类型的时候,一旦赋值就不能重新引用
volatile关键字
- 每次读的时候去读主存上的值而不是本地栈中的值,每次写都立刻写到主存当中,而不是等线程结束后再回写到主内存
- 轻量级的同步机制,实现变量的改变对所有线程可见,并不能避免线程安全
- 该方法中禁止指令重排序优化
公用的对象存放在主内存当中,每个线程去处理公用对象的时候会拷贝镜像到本地内存当中,在CPU进行读取,修改,写回到本地内存,最后写回到主内存当中,这时候线程之间不可见。volatile关键字会让读取和写的操作的时候,会立刻通知更新主内存同步,并不保证线程安全。
static的特点
线程共享唯一,节省内存开销,优先于构造函数加载
- 和类的信息加载而一起加载,不依赖于对象的存在,也优先于对象实例化(构造函数)加载
- 保存在方法区,线程共享。
- 线程共享所以节省内存开销,比如一些常量对象,另外常量方法不需要实例化对象再调用他,可以直接类名.方法调用,这样不仅简约代码,而且避免实例化对象的内存开销
- 线程共享所以可以统一维护多个相同类型的对象属性值。
- 常用形式: 静态方法,静态成员变量,静态代码块
网友评论