并发编程 不可变模式

本文将介绍如何利用不可变模式解决并发问题,并运用享元模式减少内存占用。

一、不变模式解决并发问题

如果共享变量只能被读,不能被写,它的并发问题便不会存在。

因为无论何时、何地、何人访问,它的值都不会改变。

二、不可变类

在 Java 中,要创建一个不可变的类,做法是:

  • 将所有成员变量声明为 final

    声明为 final 的成员变量一旦初始化后便不可被改变,确保所有成员变量只能被赋值一次

  • 不提供 SETTER

    避免成员变量在类被实例化后赋值

  • 让类本身也成为 final

    防止类被继承

  • 对类型为 “可变类” 的成员变量做特殊处理

    • 不应在方法中改变成员变量的内容
    • 不应对外提供成员变量的指针,可以提供深度拷贝以替代

三、不可变类 + 享元模式

1. 享元模式

享元模式主要用于减少创建对象的数量,以减少内存占用和提高性能。

其本质是一个对象池,当需要获取对象时,首先尝试从对象池中寻找, 如果没有才创建新对象,并将新对象放入对象池中。

2. 不可变类 + 享元模式

不可变类 + 享元模式,可以避免每次修改都创建一个新的不可变对象,造成内存的浪费。

3. Java 与不可变类 + 享元模式

Java 的 Long、Integer、Short、Byte 等基本类型的包装类都用到了不可变类 + 享元模式。

参考

  • Java 并发编程实战