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类是可变类,这两个类是可相互转换。在实际应用中注意根据需求选择,选择对了可以提高程序的性能。