多线程程序设计学习(3)immutable pattern模式
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模式的更多相关文章
- 多线程程序设计学习(9)worker pattern模式
Worker pattern[工作模式]一:Worker pattern的参与者--->Client(委托人线程)--->Channel(通道,里边有,存放请求的队列)--->Req ...
- 多线程程序设计学习(2)之single threaded execution pattern
Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResourc ...
- 多线程程序设计学习(6)Producer-Consumer模式
Producer-Consumer[生产消费者模式]一:Producer-Consumer pattern的参与者--->产品(蛋糕)--->通道(传递蛋糕的桌子)--->生产者线程 ...
- 多线程程序设计学习(5)balking模式和timed模式
Balking[返回模式]timed[超时模式]一:balking pattern的参与者--->GuardedObject(被警戒的对象) --->该模式的角色:模拟修改警戒对象的线程, ...
- 多线程程序设计学习(10)Future pattern
Future pattern[订单取货模式] 一:Future pattern的参与者--->Client(客户需求)--->Host(蛋糕门店)--->Data(票据和蛋糕的接口) ...
- 多线程程序设计学习(7)read-write lock pattern
Read-Write Lock Pattern[读写]一:Read-Write Lock Pattern的参与者--->读写锁--->数据(共享资源)--->读线程--->写线 ...
- 多线程程序设计学习(4)guarded suspension模式
Guarded Suspension[生产消费者模式] 一:guarded suspension的参与者--->guardedObject(被防卫)参与者 1.1该 ...
- 多线程程序设计学习(13)Active Object pattern
Active Object[接收异步消息的对象] 一:Active Object的参与者--->客户端线程(发起某种操作请求处理)--->代理角色(工头)--->实际执行者(工人)- ...
- 多线程程序设计学习(12)Thread-soecific storage pattern
Thread-Specific-Storage[线程保管箱] 一:Thread-Specific Storage的参与者--->记录日志的线程(ClientThread)--->负责获取不 ...
随机推荐
- rsync 文件校验及同步原理及rsync server配置
参考:http://rsync.samba.org/how-rsync-works.html 我们关注的是其发送与接收校验文件的算法,这里附上原文和我老婆(^_^)的翻译: The Sender Th ...
- 【面试题015】链表中倒数第k个结点
[面试题015]链表中倒数第k个结点 可以用两个指针,当第一个指针指向了第k个时候,第二个指针让他指向链表的第一个元素,然后这两个指针同时向后面移动, 当第一个指针移动到末尾的时候,第二个指针指 ...
- MYSQL日常操作命令再熟悉
1,创建用户及密码: CREATE USER 'user'@'%' IDENTIFIED BY 'password'; 2,创建数据库: create database PDB_chengang de ...
- 【转载】Ssh整合开发介绍和简单的登入案例实现
Ssh整合开发介绍和简单的登入案例实现 Ssh整合开发介绍和简单的登入案例实现 一 介绍: Ssh是strtus2-2.3.1.2+ spring-2.5.6+hibernate-3.6.8整合的开 ...
- lintcode :Reverse Words in a String 翻转字符串
题目: 翻转字符串 给定一个字符串,逐个翻转字符串中的每个单词. 样例 给出s = "the sky is blue",返回"blue is sky the" ...
- linux下安装Apache(https) 服务器证书安装配置指南
一. 安装准备 1. 安装Openssl 要使Apache支持SSL,需要首先安装Openssl支持.推荐下载安装openssl-0.9.8k.tar.gz 下载Openssl:http: ...
- eclipse(STS,myeclipse)老是报ThreadPoolExecutor$Worker.run()
资料地址:http://stackoverflow.com/questions/6290470/eclipse-debugger-always-blocks-on-threadpoolexecutor ...
- PHP程序员的40点陋习
1.不写注释 2.不使用可以提高生产效率的IDE工具 3.不使用版本控制 4.不按照编程规范写代码 5.不使用统一的方法 6.编码前不去思考和计划 7.在执行sql前不执行编码和安全检测 8.不使用测 ...
- sql 存储过程 循环使用
USE [clab] GO /****** Object: StoredProcedure [dbo].[sp_bd_getResultByEcd] Script Date: 08/06/2014 1 ...
- 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务(老罗学习笔记5)
在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行.今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件.因此,软件和硬件的关系 ...