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类是可变类,这两个类是可相互转换。在实际应用中注意根据需求选择,选择对了可以提高程序的性能。
相关推荐
dot-prop-immutable, 点prop的不可变版本,带有一些扩展名 dot-prop-immutable 点prop的不可变版本,带有一些扩展名。npm install dot-prop-immutable这个模块的动机是在不改变普通JavaScript对象的现有状态的情况
了解了redux-immutable的基本用法后,我们来看看压缩包中的文件`redux-immutable-master`。这通常代表了项目的源代码仓库,包含项目的根目录、README文件、源码、测试文件、配置文件等。开发者可以通过查看源码来...
在`chai-immutable-master`压缩包中,包含的是`chai-immutable`项目的源代码。通常,这样的项目会包含以下组成部分: 1. **源码**:主要位于`src`目录下,这是实现`chai-immutable`核心功能的JavaScript代码。 2. *...
java java_leetcode题解之Range Sum Query - Immutable.java
(注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...
**前端开源库-typed-immutable** 在前端开发中,数据管理是至关重要的,尤其是在大型应用中,保持数据的一致性和可预测性对于代码的维护和性能优化有着决定性的作用。`typed-immutable`是一个专门为JavaScript设计...
`seamless-immutable` 是一个专门针对JavaScript设计的不可变数据结构库,它为开发者提供了与原生JavaScript数组和对象兼容的接口,同时确保了数据一旦创建就无法被修改。这个库的核心理念是为了帮助开发者实现更...
记录自己学习《图解Java多线程设计模式》这本书的全部过程 本书上传的所有代码都是可以运行的,在此附上本书源码地址: 在此向本书作者和译者表示感谢 运行环境 Eclipse版本:Oxygen.2 Release (4.7.2) JDK版本:jdk...
这个ID在进程运行期间保持不变,确保了在多线程或者分布式环境中的数据追踪和标识的独特性。 不可变性(Immutability)在编程中是一个重要的概念,尤其是在JavaScript这样的语言中,它通常用于避免因对象状态改变而...
Immutable.js 是一个著名的实现不可变数据结构的库,但“immutable-core”则更专注于提供核心的不变数据操作功能。 **二、为什么使用Immutable-core?** 1. **性能提升**:通过减少不必要的对象复制,immutable-...
在编程领域,不可变对象(Immutable Object)是一种重要的设计模式,尤其在多线程和并发环境中,它提供了安全性和性能优化。在这个初学者教程中,我们将深入探讨C#中的不可变对象,包括“内部不变性”和“观察不变性...
go-immutable-radix, 在Golang中,一个不可变的基数树实现 go-immutable-radix 提供实现不可变 radix的iradix 包。 包只提供单个 Tree 实现,针对稀疏节点优化。作为一个基数树,它提供以下内容:O(k) 操作。在许多...
java11-streams-laziness-needs-immutable-collections 使用可变集合作为流源的示例可能会在处理过程中引起认知中断。 参考: 前言 流在几个方面与集合有所不同: 没有存储空间。 流不是存储元素的数据结构。 而是...
ToDo-react-redux-immutable, ToDo应用显示使用反应,重现和ImmutableJS的最佳实践 技巧,技巧和最佳实践,使用反应,重现和 ImmutableJS请检查文章解释逻辑> ...ToDo应用演示如何使用Red
本知识点将深入探讨Java多线程设计以及如何利用“不可变对象”(immutable objects)来避免多线程环境中的非安全问题。 一、Java多线程基础 1. 线程的创建:Java提供了两种创建线程的方式——继承Thread类和实现...
CKS - Practise Immutable Resource
目录: 漫谈UML Introduction 1 Java语言的线程 Introduction 2 多线程...总结 多线程程序设计的模式语言 附录A 练习问题的解答 附录B Java的内存模型 附录C Java线程的优先级 附录D 线程相关的主要API 附录E 参考文献
vnode-immutable-thunk 的不变的thunk优化。 安装 npm install vnode-immutable-thunk 例子 如果要避免重新渲染子树,请使用ImmutableThunk 。 仅当您传递给子树的参数更改时, ImmutableThunk才会重新评估子树。 ...
2. **提高性能**:通过利用共享数据结构(如尾递归优化和 Map 的键值对引用不变性),Immutable.js 可以实现高效的浅层拷贝和对比,减少不必要的对象复制。 3. **时间旅行与状态管理**:在 Redux 或其他状态管理库...
这种特性有时会导致难以预测的副作用,尤其是在多线程环境或者复杂的状态管理中。因此,引入不可变性可以提高代码的可预测性和可测试性。 这个库的名字“immutable-require-valid-optional-object”暗示了它的两个...