上一篇讲了Single Thread Execution模式,主要使用了synchronized对某一个代码加锁,防止被多个线程同时访问导致数据出错。这一篇讲下不需要synchronized的情况。
因为synchronized是一种开销大的操作,所以能避免使用尽量避免。之前使用它可以避免由于实例的状态被多个线程同时访问修改导致数据出错,那么假设一个实例的状态根本不可以改变,那么即使多个线程访问也不会出现数据错误了。
看下面这个类:
public final class Person {
private final String name;
private final String address;
public Person(String name, String address) {
super();
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public String toString() {
// TODO Auto-generated method stub
return "Person name:"+name+",address:"+address;
}
}
由于这个该类的成员变量均为private final修饰,且不提供setter方法,所以外部即不能改变引用指向的对象值,也不能改变引用指向的对向的对象。所以该类的对象可以看做状态不可改变。
像这样,一个类的对象的字段在初始化之后就不可改变的类我们叫做Immutable的类(当然,就算了字段全部指明为private final,并且没有setter方法,如果字段不详上面那样是String这种不可改变数值的类,仍然不是一个Immutable的类,因为getter会将字段的引用交给外部类)这种类的优点在于在高并发的条件下,不需要synchronized来保护,可以在不丧失安全性和生命性的前提下提高程序的执行性能。
java标准库中就有这样成对的Immutable和mutable类,比如String和StringBuilder,前者一旦初始化状态不可更改,后者可以更改,当属性需要频繁更改,就是用StringBuilder,当属性只需要读取的时候,就使用String。像I基本类型的包装类(比如java.lang.Interger)、java.lang.Color的类也都是Immutable类。