多线程编程模式之Immutable模式

一、Immutable模式介绍

Immutable模式同Single Thread Execution 模式一样,同样定义了一种在多线程环境下对共享资源的访问方式。Immutable即为不变的,即该模式所访问的资源是不可变的,这和STE是相反的。相比较而言,该模式较易实现。

二、Immutable模式的应用场景

  1. 多线程编程环境
  2. 多线程并发访问该共享资源
  3. 共享资源一旦生成就不再发生变化,即多线程并发的访问不会对资源产生影响,从操作系统的角度来看,这类资源并不属于临界资源(系统资源有两种:互斥访问和允许同时访问),所以也就没有互斥操作了。

三、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模式只要该资源对访问者来说是不可变的即可;

猜你喜欢

转载自blog.csdn.net/slx3320612540/article/details/81039047