java多线程编程:不可变对象
1: 什么对象称为不可变对象
简单的说满足以下几点:
1: 类被final修饰
2:引用对象参数被final修饰(保证只会被实例化一次)
3: 不提供set方法(保证不会被外部修改,反射除外)
4:构造赋值时提供防御性(深拷贝)赋值
具体如下:

2:不可变对象运作方式
我们先取消上面不可变对象的防御性赋值

再执行具体测试如下:

打开防御性赋值


Immust对象就不会被影响 age.setYear("2001") 改变的age1对象 而没有改变this.age ,其缺点是会消耗更多内存空间
同理 提供Get方法 没有防御性的



使用防御性get值

则不会。
3:不可变对象的使用场景
不可变对象通常是在多线程中用来优化锁的使用场景的。
比如多线程共享的成员变量 在使用这个对象时 为了保证线程的安全 通常会上锁
而如果是使用不可变对象(通常要static 与 final 修饰的) 就可以不用锁

比如slf4j中的loggerFactory就是典型的不可变对象

2: 链式对象传递 中保证其对象不被误操作
比如说 a (o1..)-> b(01..)->..
保证这个o1不会被误修改 导致不可预的错误
浙公网安备 33010602011771号