多线程学习之二坚不可摧模式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,就会被破坏。
Student类
/**
*
*/
package com.benxq.thread3; /**
* Created by qucf on 2015年10月22日.
*/
public class Student { private String name;
private String 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;
}
/**
* @param name
* @param address
*/
public Student(String name, String address) {
super();
this.name = name;
this.address = address;
}
}
Room类
/**
*
*/
package com.benxq.thread3; /**
* 看似immutable类
* 其实不是,Student是可变的类
* Created by qucf on 2015年10月22日.
*/
public final class Room { private final Student student;
private final String name; public Room(String name,Student student){
this.name=name;
this.student=student;
} public Student getStudent() {
student.setName("benxq");
return student;
}
public String getName() {
return name;
} }
测试类
/**
*
*/
package com.benxq.thread3; /**
* Created by qucf on 2015年10月22日.
*/
public class Test { public static void main(String[] args) {
Student student=new Student("zhangsan", "beijing");
Room room=new Room("room1", student);
Student s2=room.getStudent();
System.out.println(s2.getName());
//打印 benxq
} }
坚不可错模式示范
/**
*
*/
package com.benxq.thread3; /**
* 一个类定义成final类,是不允许有子类
* 一个变量定义成final变量,意味着,一旦第一次赋值,便不可更改。
* 其中的字段也是不可变的
* 这个不可变性。不一定由final来决定。
* 所谓不可变性,是一种设计的模式。不可改变,是为了防止多线程破坏对象。
* 这种不可变,不需要保护的前提,就是不能被修改,一旦实例化,只提供读取操作
* 而是可以通过很多方式:比如,私有化,不提供赋值操作,final修饰。
* Created by qucf on 2015年10月22日.
*/
public final class Room { private final Student student;
private final String name; public Room(String name,Student student){
this.name=name;
this.student=student;
} public Student getStudent() {
return student;
}
public String getName() {
return name;
} }
多线程学习之二坚不可摧模式Immutable pattern的更多相关文章
- Java多线程学习(二)synchronized关键字(2)
转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79670775 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...
- Java多线程学习(二)synchronized关键字(1)
转载请备注地址: https://blog.csdn.net/qq_34337272/article/details/79655194 Java多线程学习(二)将分为两篇文章介绍synchronize ...
- 反馈法学习设计模式(一)——策略模式Strategy Pattern
简介(Introduction) 之前学习Java8实战时,遇到一个很好的策略模式示例.便想着借着这个示例结合反馈式的方法来,学习策略设计模式,也以便后面反复琢磨学习. 首先我们通过练习,逐步写出符合 ...
- JavaScript学习笔记(十二) 回调模式(Callback Pattern)
函数就是对象,所以他们可以作为一个参数传递给其它函数: 当你将introduceBugs()作为一个参数传递给writeCode(),然后在某个时间点,writeCode()有可能执行(调用)intr ...
- Java多线程学习笔记--生产消费者模式
实际开发中,我们经常会接触到生产消费者模型,如:Android的Looper相应handler处理UI操作,Socket通信的响应过程.数据缓冲区在文件读写应用等.强大的模型框架,鉴于本人水平有限目前 ...
- Java多线程学习(二)
一.定义产生返回值的任务 在上一篇文的介绍中,我们知道了定义任务通常的方法是定义一个实现Runnable接口的类,这个类被我们成为任务.然而也很容易注意到,任务的最重要的一个方法就是run( )方法, ...
- 多线程学习之三生产者消费者模式Guarded Suspension
Guarded Suspension[生产消费者模式] 一:guarded suspension的参与者--->guardedObject(被防卫)参与者 1.1该 ...
- 多线程学习系列二(使用System.Threading)
一.什么是System.Threading.Thread?如何使用System.Threading.Thread进行异步操作 System.Threading.Thread:操作系统实现线程并提供各种 ...
- C# 多线程学习系列二
一.关于前台线程和后台线程 1.简介 CLR中线程分为两种类型,一种是前台线程.另一种是后台线程. 前台线程:应用程序的主线程.Thread构造的线程都默认为前台线程 后台线程:线程池线程都为后台线程 ...
随机推荐
- mac提升yosemite后php 扩展修复
mac升级之后 php 正积极提升自己,导致php环境破坏 所以 例如有以下几点需要修复 1. sudo ln -s /Applications/Xcode.app/Contents/Develope ...
- Unity该插件NGUI得知(9)—— Tween并转换成世界坐标系的大小NGUI尺寸
在游戏中,还有一种比较常见的动画,这是进球后产生,分数将被显示在游戏,而快速移动,使其失去位置加入.就打算使用NGUI的Tween来制作这样的分数动画效果. 依据 Unity插件之NGUI学习(2), ...
- HDU 2460 Network(双连通+树链剖分+线段树)
HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...
- cocos2d-x3.0 解释具体的新的物理引擎setCategoryBitmask()、setContactTestBitmask()、setCollisionBitmask()
转载请注明出处:游戏开发实验室http://blog.csdn.net/u010019717/article/details/32942641 我在编写游戏的时候遇到了这个问题. 物理引擎其它的内容 ...
- 金蝶K3管理软件PDA条码解决方式,盘点机与金蝶K3无缝对接
申明:以上文字为"武汉汉码科技有限公司"原创,转载时务必注明出处. 技术分享,沟通你我,共同进步!www.hanma-scan.com 原帖:http://www.hanma-sc ...
- Cordic 算法之 反正切
在通信的算法中,常采用Cordic算法之一,知道角度产生正交的的正弦余弦, 或者知道正弦和余弦求角度,求反正切. 1. 求正弦和余弦值. 方法:旋转角度,得到正弦余弦值: 再旋转角度,到达下一个正弦余 ...
- python 基础知识点整理 和详细应用
Python教程 Python是一种简单易学,功能强大的编程语言.它包含了高效的高级数据结构和简单而有效的方法,面向对象编程.Python优雅的语法,动态类型,以及它天然的解释能力,使其成为理想的语言 ...
- Java虚拟机类型卸载和类型更新解析(转)
转自:http://www.blogjava.net/zhuxing/archive/2008/07/24/217285.html [摘要] 前面系统讨论过java 类型加载(loa ...
- NSOJ Minimum Transport Cost
These are N cities in Spring country. Between each pair of cities there may be one transportation tr ...
- SQL Prompt——SQL智能提示插件
数据库是大家在项目开发中肯定会用到的,C#项目用的最多的就是微软自家的SQL Server了.不可否认,微软的Visual Studio开发平台很好用,很直观的体现就是智能提示.敲几个字符,相关的信息 ...