多线程四immutable模式
什么是immutable模式
immutable就是不变的,不发生改变的意思。我们之前之所以存在多线程安全问题是因为多个线程共用一个共享数据,并且某些线程会对该数据进行修改操作。immutable模式中存在着确保实例状态不发生改变的类。在访问这些实例时并不需要执行耗时的同步代码,因此如能使用该模式,定能提高程序的性能。
事例
public final classPerson{//该类声明为了final类型,表示我们无法通过创建
//Person类的子类,这虽不是immutable模式的必要条件,
//但却是防止子类修改其字段的措施
private final String name;//属性设置为private,也就是这个属性只能在类内部才能放访问,也是种防止子类修改的措施
//同时属性被声明为了final,意味着一旦字段被赋值就不能再赋值
public Person(String name){
this.name=name;
}
//类内设有读取字段的get方法但没有修改字段的set方法
public Stirng getName(){
return name;
}
public String toString(){
...
}
}
何时可以使用immutable模式
正如前面提到的实例创建后,状态就不再发生变化,实例的状态是由属性的值决定的,所以将属性声明为final字段且不存在set方法是重点所在,当然只有这些保护是不够的比如
public final class Person{
private final StringBuilder sb;
public Person(String name){
sb=new StringBuilder(name);
}
public StringBuilder getSb(){
return sb;
}
}
上面这个例子把类声明为final,且将字段sb声明为StringBuffer且没有set方法
但是这个类在多线程下同样是线程不安全的
StringBuilder sb=person.getSb();
sb.append("a");
sout(person.getSb());
我们会发现属性还是修改了,因为final虽然使字段的值没有被修改,但是将字段指向的值修改了
标准类库中使用到的immutable模式
- 表示字符串的String类
- 表示大数字的BigInteger和BigDecimal类
- 表示正则表达式的Pattern类
- Integer类等
- 表示颜色的Color