彻底学会Java并发编程——不可变对象

25 阅读1分钟

不可变对象的设计:

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:

字节码如下:

无状态

不设置成员变量。

因为成员变量保存的数据称为状态信息,所以没有成员变量称为无状态。