Immutable 模式

Immutable 模式

java.lang.String类用于表示字符串。String类中并没有修改字符串内容的方法。也就是说,String类的实例所表示的字符串的内容绝对不会发生变化、

正因为如此,String类中的方法无需声明为synchronized。因为实例的内部状态不会发生改变,所以无论String类被多少个线程访问,也无需执行线程的互斥处理。

实例程序

类的一览表

名字 说明
Person 表示人的类
Main 测试程序行为的类
PrintPersonThread 显示Person实例的线程的类

Person类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public final class Persion {    // 声明为final,无法创建该类的子类
private final String name; // 字段设置为private和final,表示一旦被赋了值,就不能再改变这个字段的值

private final String address;

public Persion(String name, String address) {
this.name = name;
this.address = address;
}

public String getName() {
return this.name;
}

public String getAddress() {
return this.address;
}

public String toString() {
return "[ Person: name = " + name + ", address = " + address + " ]";
}
}

Main类

1
2
3
4
5
6
public static void main(String[] args) {
Persion alice = new Persion("Alice", "Alaska");
new PrintPersionThread(alice).start();
new PrintPersionThread(alice).start();
new PrintPersionThread(alice).start();
}

PrintPersonThread类

1
2
3
4
5
6
7
8
9
10
11
12
13
public class PrintPersionThread extends Thread {
private Persion persion;

public PrintPersionThread(Persion persion) {
this.persion = persion;
}

public void run() {
while (true) {
System.out.println(Thread.currentThread().getName() + " prints " + persion);
}
}
}

实例程序的类图

类图
字段后面添加了{ frozen }约束,是UML的标识法,表示“实例被创建且字段被初始化之后,字段的值就不会被再修改”。这对应于java中的final字段。
方法名后面添加了{ concurrent }约束,这也是UML的标识法,它明确表示“多个线程同时执行也没有关系”。这对应于Java中的“无需声明为synchronized方法”

参考

《图解Java多线程设计模式》

0%