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