并发系列之三Immutable

前言

immutable是指永恒,不会改变的意思,就像java.lang.String类中,并没有提供任何改变字符串属性的方法

immutable Pattern

首先模拟一个案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package com.zwl.utest3;
public final class Person {
//不允许修改的地址
private final String address;
//不允许修改的姓名
private final String name;
public Person(String name, String address) {
this.name = name;
this.address = address;
}
//有final就不会有set方法,控制外部对其的修改
public String getAddress() {
return address;
}
public String getName() {
return name;
}
public String toString(){
return "[ Person: name="+name+ ",address="+address+"]";
}
}

下面是人的线程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.zwl.utest3;
public class PersonThread extends Thread {
private Person person;
public PersonThread(Person person) {
this.person = person;
}
public void run(){
while(true){
//得到线程的名并打印出人的信息
System.out.println(Thread.currentThread().getName()+"prints"+person);
}
}
}

测试类

1
2
3
4
Person person=new Person("A1","AA");
new PersonThread(person).start();
new PersonThread(person).start();
new PersonThread(person).start();

测试结果

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模式
该模式最大的优点就是实例的状态不会改变,所以没必要进行保护

热评文章