背景介绍:Immutable类能保证实例状态绝不会改变,如String,可以利用该类省去使用共享互斥机制所浪费的时间
public final class Person {
private final String name;
private final String address;//换成StringBuffer无法保证不变性
public Person(String name, String address) {
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public String toString() {
return "[ Person: name = " + name + ", address = " + address + " ]";
}
}
public class PrintPersonThread extends Thread {
private Person person;
public PrintPersonThread(Person person) {
this.person = person;
}
public void run() {
while (true) {
System.out.println(Thread.currentThread().getName() + " prints " + person);
}
}
}
public class Main {
public static void main(String[] args) {
Person alice = new Person("Alice", "Alaska");
new PrintPersonThread(alice).start();
new PrintPersonThread(alice).start();
new PrintPersonThread(alice).start();
}
}
public class Line {
private final Point startPoint;
private final Point endPoint;
public Line(int startx, int starty, int endx, int endy) {
this.startPoint = new Point(startx, starty);
this.endPoint = new Point(endx, endy);
}
public Line(Point startPoint, Point endPoint) {
this.startPoint = new Point(startPoint.x, startPoint.y);//此时可保证Line里面Point不变或者将Point类设为Immutable类型
this.endPoint = new Point(endPoint.x, endPoint.y);//this.endPoint=endPoint;错误,不能保证Point不变
}
public int getStartX() { return startPoint.x; }
public int getStartY() { return startPoint.y; }
public int getEndX() { return endPoint.x; }
public int getEndY() { return endPoint.y; }
public String toString() {
return "[ Line: " + startPoint + "-" + endPoint + " ]";
}
}
public final class ImmutablePerson {
private final String name;
private final String address;
public ImmutablePerson(String name, String address) {
this.name = name;
this.address = address;
}
//别的线程会创建Persion改变name、address的值,需加上synchronized(person)
public ImmutablePerson(MutablePerson person) {
this.name = person.getName();
this.address = person.getAddress();
}
public MutablePerson getMutablePerson() {
return new MutablePerson(this);
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public String toString() {
return "[ ImmutablePerson: " + name + ", " + address + " ]";
}
}