Immutable Pattern(状态不变模式)
原理:String字符串类,该类没有提供任何修改字符串属性的方法,也就是说,字符串
实例所代表的字符串属性,绝对不会改变。无论多少线程如何对String访问,因为
实例的内部状态不会改变,所以线程并不需要考虑共享互斥。
Immutable Pattern的设计灵感就源自这里。
Immutable “永恒的,不会改变的”的意思,在该模式中,有着能够保持实例
状态绝不会改变的类(Immuable类),因此多线程访问该实例可以省去共享互斥的时间
,如若妥善运用,将提高程序的性能。
注意:根据这个模式,我们平常设计多线程程序的时候,在定义共享资源类需要考虑
该类是设计成状态永远不变的类,还是设计成可变的类,当然一切以实际
需求为根本。
该模式试用地方:
1,当实例产生后,状态不再变化。
2,实例需要共享,而且访问频繁,去除了synchironed修饰,提升效率
实例:
第一步:设计资源共享的类Person,该类实例状态需要永恒不变。所以通过以下
几种步骤可以做到:
1,所有属性只提供get方法,不提供set方法
2,该类声明成final,防止子类修改属性
3,所有属性声明成private的。
代码如下:
package com.supan.thread;
/*
* 该类是共享资源类,需要状态永久不变
* 一旦一个属性声明成final,就是Myeclipse的自动生成getter setter方法也会自动忽略到setter方法的
* 这个类的所有设计都以始终不变为目的,所有,Person中的所有方法也不用加上synchinored关键字,这样
* 可以提高程序的性能
*/
public final class Person {
private final String name;
private final String address;
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 + " Person'address: " + address;
}
}
第二部:线程类:
package com.supan.thread;
/*
* 该类用来不停的显示构造器中传入的Person类实例
*/
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() + ":" + person);
}
}
}
第三部:测试类:
import com.supan.thread.Person;
import com.supan.thread.PrintPersonThread;
public class MainPerson {
public static void main(String[] args) {
Person person = new Person("Supan","SZ");
new PrintPersonThread(person).start();
new PrintPersonThread(person).start();
new PrintPersonThread(person).start();
}
}
拓展思维:
1,对于不变类,和可变类在jdk标准类文件中也有。例如String类和StringBuffer类,String类是不变类,String
Buffer类是可变类,这两个类是可相互转换。在实际应用中注意根据需求选择,选择对了可以提高程序的性能。