不可变对象的设计:
string类
string类是不可变的:
因为value是final,hash是私有的且没有set方法。
类里面发final保证方法不会被覆盖。
保护性拷贝:
创造新的字符串对象的时候会生成新的char[]value,对内容进行复制。这种手段是通过创建副本对象来避免共享。
享元模式
防止因为上面的保护性拷贝而导致的对象创建的太频繁,对象的个数太多,不可变类一般会关联一个设计模式。
需要重用数量优先的同一对象的时候使用。
JDK中boolean、byte、short、integer、long、charater等包装类提供了valueof方法。
长整型为例:
这是缓存模式的实现方式,在valueof为-128——127的时候之间的long对象,在这个范围内会重用对象,大于这个范围才会重新创建long对象。
不可变类运行时单个方法是线程安全的,多个方法的组合不能保证线程安全。
所以用atomicreference来保护bigdecimal,如上的例子。下面withdraw部分涉及了多个操作,所以不能保证线程安全。
自定义连接池的实现
原子整数数组对基本数组进行保护。
CAS适合短时间操作的代码片段
final原理
final会在赋值后加入写屏障。
不加final的话:
字节码是getstatic
加final:
字节码如下:
无状态
不设置成员变量。
因为成员变量保存的数据称为状态信息,所以没有成员变量称为无状态。