`
Supanccy2013
  • 浏览: 214463 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java多线程-Immutable Pattern不变模式

阅读更多

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics