上一章讲的是线程互斥的synchronized实现,这样做会影响性能,如何才能做到既不影响性能又能达到线程安全的目的呢,就是使用状态绝不会改变的类,Java中的应用就是String类。

public class ImmutableThreadTest {

	/**
* @param args
*/
public static void main(String[] args) {
Person p = new Person("Alice", "Alaska");
new PrintPersonThread(p).start();
new PrintPersonThread(p).start();
}
} class PrintPersonThread extends Thread{
private Person person;
public PrintPersonThread(Person person){
this.person = person;
}
@Override
public void run() {
while(true){
System.out.println(Thread.currentThread().getName() + " Prints " + person);
}
}
} 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;
}
@Override
public String toString() {
return "[person:name=" + name + ", address=" + address + "]";
}
}

  

这个模式很简单,就是将对象的所有字段都设为final的,这样就只有在构造的时候初始化一次,以后都是只读状态,当一个类不需要修改对象内变量时,可以使用Immutable模式。

最新文章

  1. Python中的类、对象、继承
  2. Java碎片知识(笔记)
  3. Appium使用PageFactory初始化对象时报空指针错误
  4. iOS之 APP异常捕获反馈给服务器
  5. codeforces 446C DZY Loves Fibonacci Numbers(数学 or 数论+线段树)(两种方法)
  6. C#转换日期类型
  7. hdu 3461 Code Lock(并查集)2010 ACM-ICPC Multi-University Training Contest(3)
  8. [Everyday Mathematics]20150126
  9. 【HTML】Beginner1:TagsAttributesElements
  10. c#开发Mongo笔记第一篇
  11. 使用gfortran将数据写成Grads格式的代码示例
  12. vs2008如何创建DLL和使用DLL
  13. MySQL 出现 The table is full 的解决方法【转】
  14. Django中扩展Paginator实现分页
  15. Docker第一弹:下载运行hello-world程序
  16. yaf插件类的使用
  17. [BZOJ3000] Big Number (Stirling公式)
  18. vue中v-for的使用
  19. Scala学习(七)练习
  20. javascript Date定义和体验

热门文章

  1. 通过adb命令查看SN、CID码等信息
  2. 【转】/bin/bash^M: bad interpreter: 没有那个文件或目录
  3. Django框架(七)—— 模板层:变量、过滤器、标签、自定义标签和过滤器
  4. NIO 源码分析(02-2) BIO 源码分析 Socket
  5. 7年Java后端被淘汰,一路北漂辛酸史。。。
  6. 高级UI晋升之View渲染机制(二)
  7. hdu6315 /// 线段树区间更新
  8. Handler Looper源码解析(Android消息传递机制)
  9. C语言之内存
  10. add new color number to the color drop down in enovia PLM