前言
immutable是指永恒,不会改变的意思,就像java.lang.String类中,并没有提供任何改变字符串属性的方法
immutable Pattern
首先模拟一个案例
下面是人的线程
测试类
测试结果
Thread-2prints[ Person: name=A1,address=AA]
Thread-2prints[ Person: name=A1,address=AA]
Thread-2prints[ Person: name=A1,address=AA]
Thread-2prints[ Person: name=A1,address=AA]
Thread-2prints[ Person: name=A1,address=AA]
Thread-2prints[ Person: name=A1,address=AA]
以下一直重复
可以发现上面的字段都是final并且没有修改该字段的方法
正因为如此,所以就不需要使用synchronized来限制,这在性能上就大大提高了
何时使用
1.当实例产生后,状态不再变化时
2.实例需要共享,而且访问很频繁时
当然,有时也需要变与不变的转换,就像StringBuffer是一个线程不安全的类,在它的构造器中有String作为参数,而在String类中也有StringBuffer作为参数
另外像java中的基本类型boolean、int、long等都是immutable模式
该模式最大的优点就是实例的状态不会改变,所以没必要进行保护