不可变类设计
- final的使用:
- 修饰属性或者private而且没有set方法,保证为只读属性;
- 修饰类,防止子类破坏不可变性;
- String的底层是private final char[] value;
- 当传入char数组的时候,会给value复制一份value【保护性拷贝:防止共享】;
- finall的原理:
- final变量的赋值之后,会加入写屏障【flush】,以保证读取的时候不是默认值【因为赋值是两步操作,首先是默认值,之后才是所赋值】;
- 对于final的静态变量
- 当在short范围内,会直接放入当前栈中【直接存储在字节码指令流中】;
- 当超过short范围,会放入常量池中;
- 当没有final修饰的时候,会在堆中;
- 无状态:没有成员变量,那么一定是线程安全的;