什么是不变性(Immutable)
如果对象在创建后,状态就不被修改,那么它就是不可变得
不可变对象要求,所有属性都不能改变
具有不可变性的对象一定是线程安全的,不需要其他安全措施,也能保证线程安全。
final的作用
类防止被继承,方法防止被重写,变量防止被修改
天生是线程安全的,不需要额外的同步措施,进而也不需要过多的性能损失。
3种用法:
修饰变量:
修改变量,意味着值不能被修改。
如果变量是对象,那么变量的引用不能变,但是对象的内容可以改变。
-
final修改3种变量:(赋值时机)
a. 类中的final属性- 声明变量时等号右边直接赋值
- 构造函数中赋值
- 构造代码块中赋值(不常用)
- 如果不用第一种方式,必需选择方式2,或者3赋值,final不能不赋值。
b. 类中的static final 属性
- 声明变量时等号右边直接赋值
- 静态代码块中赋值。
c. 方法中的final变量
- 不规定赋值时机
- 要求使用前必需赋值
- 这和非final修饰的变量是一样的
修改方法:
不允许修饰构造方法
不可被重写
修饰类:
不可被继承
String就是final的,不能被继承
不变性和final的关系
不变性并不意味着就是final
满足一下条件,对象才是不可变
- 对象创建后,状态就不能修改
- 所有属性都是final修饰的
- 对象不会发生逸出,private修饰的
栈封闭——把变量写在线程内部
因为栈是线程私有的,栈中不会发生线程安全问题