java多线程-Immutable Pattern不变模式_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java多线程-Immutable Pattern不变模式

java多线程-Immutable Pattern不变模式

 2013/8/20 3:35:32  Supanccy2013  程序员俱乐部  我要评论(0)
  • 摘要:ImmutablePattern(状态不变模式)原理:String字符串类,该类没有提供任何修改字符串属性的方法,也就是说,字符串实例所代表的字符串属性,绝对不会改变。无论多少线程如何对String访问,因为实例的内部状态不会改变,所以线程并不需要考虑共享互斥。ImmutablePattern的设计灵感就源自这里。Immutable“永恒的,不会改变的”的意思,在该模式中,有着能够保持实例状态绝不会改变的类(Immuable类),因此多线程访问该实例可以省去共享互斥的时间,如若妥善运用
  • 标签:多线程 Java 模式 线程

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

发表评论
用户名: 匿名