一、Immutable模式介绍
Immutable模式同Single Thread Execution 模式一样,同样定义了一种在多线程环境下对共享资源的访问方式。Immutable即为不变的,即该模式所访问的资源是不可变的,这和STE是相反的。相比较而言,该模式较易实现。
二、Immutable模式的应用场景
- 多线程编程环境
- 多线程并发访问该共享资源
- 共享资源一旦生成就不再发生变化,即多线程并发的访问不会对资源产生影响,从操作系统的角度来看,这类资源并不属于临界资源(系统资源有两种:互斥访问和允许同时访问),所以也就没有互斥操作了。
三、Immutable的示例代码及分析
public class Person {//允许同时访问的共享资源类
private final String name;
private final String address;
public Person(String n,String a){
name=n;
address=a;
}
public String getName() {
return name;
}
public String getAddress() {
return address;
}
public String toString(){
return "[person:name="+name+",address="+address+"]";
}
}
public class WorkerThread extends Thread {//多线程访问者
private Person person;
public WorkerThread(Person p){
person=p;
}
public void run(){
while(true){
System.out.println(Thread.currentThread().getName()+" prints "+person);
}
}//线程的访问并不会影响资源的状态,这里仅仅将其打印出来
}
public static void main(String[] args){
System.out.println("Testing Immutable,hit CTRL+C exit!");
Person p=new Person("Alice","Alaska");
new WorkerThread(p).start();
new WorkerThread(p).start();
new WorkerThread(p).start();
}
四、对Immutable的理解
在这里,Immutable提供了对不可变资源的并发访问方式,只不过,并不涉及到互斥措施;事物都要一分为二来看,一个系统中有会变的资源就可能会有不变的资源:比如一些基本配置,像联系方式、办公地址等信息,基本上并不会随着系统的运行而改变,对于这类资源就可以使用Immutable方式去实现多线程访问啦;
既然不会变,那么1个和100个就没有区别,这里就可以考虑使用设计模式中的单例模式来管理这类对象;
单例模式确保整个系统中该类对象只有一个。但是至于系统是如何访问该对象的,并没有过多关注;
单线程模式确保多个并发线程对同一个对象的访问是互斥的,而对系统中该对象的个数并没有关注;
Immutable模式只要该资源对访问者来说是不可变的即可;