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不会被误修改 导致不可预的错误

 

posted @ 2022-01-27 14:29  热奇奇  阅读(111)  评论(0)    收藏  举报