Immutable pattern【坚不可摧模式】

一:immutable pattern的参与者
--->immutable(不变的)参与者
        1.1:immutable参与者是一个字段的值都无法更改的类。
        1.2:immutable也没有任何用来更改字段值的方法。
        1.3:immutable参与者方法不需要设置synchronized

二:immutable pattern模式什么时候使用
--->当实例产生后,状态不再变化时
        2.1实例状态不再变化是首要条件。
        2.2何为不可变状态。就是实例的值不会发生变化。
--->实例需要共享,而且访问频繁时
--->String 类是immutable类不需要synchronized保护
       StringBuffer类是非immutable类需要synchronized保护

三:immutable pattern思考
--->final关键字
        2.1:final类:当生命final类,该类无法延伸,就是不能定义子类。
        2.2:final方法:
                        若实例方法(非静态)声明成final时,该方法无法被子类覆盖重写。
                        若将类方法(静态)声明成final时,该方法无法被子类所隐藏
        2.3final变量
                        final字段只能赋值一次。
                        final(非静态)字段赋值分两种方法:(1)声明时赋值(2)通过构造器赋值
                        final(静态)字段赋值分两种方法:(1)声明时赋值(2)通过静态块赋值
        2.3覆盖和隐藏的概念
                        实例方法被子类方法所覆盖时,实际被调用的方法是在执行时决定的
                        类方法被子类方法隐藏时,实例被调用的方法是在编译时决定的。

--->immutable不变性很微妙。不是设置finnal,私有化,不提供赋值方法,就是永久不变性的。
                        final只是不可再次赋值。如果final的字段是一个可变的引用属性,那么immutable,就会被破坏。

room类

 package com.yeepay.sxf.thread2;
/**
* 看似是immutable类
* 其实不是。
* Student是可变的类
* @author sxf
*
*/
public final class Room { private final Student student;
private final String name; public Room(String name,Student student) {
super();
this.student=student;
this.name = name;
} public Student getStudent() {
student.setName("sxf");
return student;
} public String getName() {
return name;
} }

student类

 package com.yeepay.sxf.thread2;

 public class Student {
private String name;
private String address;
public Student() {
super();
}
public Student(String name, String address) {
super();
this.name = name;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
} }

测试类

 package com.yeepay.sxf.thread2;
/**
* 测试线程
* @author sxf
*
*/
public class Test { public static void main(String[] args) { Student student=new Student("hsl", "hnlh");
Room room=new Room("ddd", student);
Student student2=room.getStudent();
System.out.println(student2.getName()); //打印 :sxf
}
}

immutable范例(immutable只是一个概念模式,而不是一个固定的格式)

 package com.yeepay.sxf.thread2;
/**
* 坚不可摧模式。
* @author sxf
*
* 一个类定义成final类,是不允许有子类
* 一个变量定义成final变量,意味着,一旦第一次赋值,便不可更改。
* 其中的字段也是不可变的
*
*
* 这个不可变性。不一定由final来决定。
* 所谓不可变性,是一种设计的模式。不可改变,是为了防止多线程破坏对象。
* 这种不可变,不需要保护的前提,就是不能被修改,一旦实例化,只提供读取操作
* 而是可以通过很多方式:比如,私有化,不提供赋值操作,final修饰。
*
*/
public final class Persion {
//声明变量
private final String name;
private final String address; //构造器赋值
public Persion(String name, String address) {
this.name = name;
this.address = address;
} //提供get访问方法,但不提供set赋值方法
public String getName() {
return name;
} public String getAddress() {
return address;
} }

多线程程序设计学习(3)immutable pattern模式的更多相关文章

  1. 多线程程序设计学习(9)worker pattern模式

    Worker pattern[工作模式]一:Worker pattern的参与者--->Client(委托人线程)--->Channel(通道,里边有,存放请求的队列)--->Req ...

  2. 多线程程序设计学习(2)之single threaded execution pattern

    Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResourc ...

  3. 多线程程序设计学习(6)Producer-Consumer模式

    Producer-Consumer[生产消费者模式]一:Producer-Consumer pattern的参与者--->产品(蛋糕)--->通道(传递蛋糕的桌子)--->生产者线程 ...

  4. 多线程程序设计学习(5)balking模式和timed模式

    Balking[返回模式]timed[超时模式]一:balking pattern的参与者--->GuardedObject(被警戒的对象) --->该模式的角色:模拟修改警戒对象的线程, ...

  5. 多线程程序设计学习(10)Future pattern

    Future pattern[订单取货模式] 一:Future pattern的参与者--->Client(客户需求)--->Host(蛋糕门店)--->Data(票据和蛋糕的接口) ...

  6. 多线程程序设计学习(7)read-write lock pattern

    Read-Write Lock Pattern[读写]一:Read-Write Lock Pattern的参与者--->读写锁--->数据(共享资源)--->读线程--->写线 ...

  7. 多线程程序设计学习(4)guarded suspension模式

    Guarded Suspension[生产消费者模式] 一:guarded suspension的参与者--->guardedObject(被防卫)参与者                1.1该 ...

  8. 多线程程序设计学习(13)Active Object pattern

    Active Object[接收异步消息的对象] 一:Active Object的参与者--->客户端线程(发起某种操作请求处理)--->代理角色(工头)--->实际执行者(工人)- ...

  9. 多线程程序设计学习(12)Thread-soecific storage pattern

    Thread-Specific-Storage[线程保管箱] 一:Thread-Specific Storage的参与者--->记录日志的线程(ClientThread)--->负责获取不 ...

随机推荐

  1. phonegap 环境搭建

    经过了一番讨论,最后还是决定用phonegap来开发产品.因为用phonegap的人力成本相比原生开发还是节省了不少,并且可以跨平台.至于软件的运行效率,在ios上还是相当流畅的,在android上就 ...

  2. 使用文本文件(.txt)进行数据存取的技巧总结(相当的经典)

    使用文本文件(.txt)进行数据存取的技巧总结(相当的经典) 使用文本文件(.txt)进行数据存取的技巧总结 由于本帖内容较多,部分转自他人的心得,因此,凡转贴的地方仅用“----转----”标注,原 ...

  3. 物理地址 = 段地址*10H + 偏移地址

    程序如何执行: CPU先找到程序在内存中的入口地址 -- 地址总线 (8086有20根地址总线,每一根可以某一时传0或1, 20位的二进制数字可以表示的不同的数字的个数是2^20=1048576 10 ...

  4. web配置详解

    1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Servl ...

  5. Android开发--Activity生命周期回顾理解

    Activity和Servlet一样,都用了回调机制.我们通过类比servlet来学习Activity.当一个servlet开发出来之后,该servlet运行于Web服务器中.服务器何时创建servl ...

  6. Linux如何修改文件/文件夹内所有文件的权限

    一.修改文件权限 修改文件权限前,需要了解一下权限中的”rwx”与数字的对应关系,其中r=4,w=2,x=1. 例如:”drwxr-xr-x”,第一个”d”是代表文件夹,这里不用考虑,后面九个字符,每 ...

  7. 能量项链//区间DP

    P1056 能量项链 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2006 提高组 第一道 描述     在Mars星球上,每个Mars人都随身佩 ...

  8. cojs 简单的区间问题 解题报告

    新学了些弦图和区间图的新玩意,于是就想着出一道题目 其实这道题不用弦图和区间图的理论也是可以做的 首先考虑第一问,第一问是一个NOIP普及组水平的贪心 我们把区间按照右端点从小到大排序,之后从头到尾扫 ...

  9. Unix环境编程之定时、信号与中断

    在linux下实现精度较高的定时功能,需要用到setitimer 和 getitimer函数. 函数原型: #include <sys/time.h> int getitimer(int ...

  10. compiler 学习

    一款强大的编译器LLVM:http://llvm.org/docs/GettingStarted.html#layout http://llvm.org/docs/LangRef.html http: ...