了解什么是不变模式

不变模式

一)、不变模式的概述

使用场景: 当多线程对同一个对象进行读写操作时,为保证对象数据的一致性和正确性,有必要对对象进行同步。

作用: 确保在没有同步操作的多线程环境中,保持对象内部状态的一致性和正确性

核心思想:一个对象一旦被创建,则它的内部状态将永远不会改变,同时,其内部状态也决不会自行发生改变。

二)、不变模式与只读属性的区别

只读属性:对象本身不能被其他线程修改, 对象的自身状态却可能自行修改。

不变模式:没有一个线程可以修改其内部结构和数据,同时,其内部状态也 不会自行改变,即自对象创建后,内部状态和数据保持绝对的稳定。

只读属性举例:

一个对象的存活时间(对象的创建时间和当前时间的时间差)是只读的,因为任何一个第三方线程都不能修改这个属性,因为随着时间的推移,存活时刻都在发生变化,并不满足不变模式的要求,无论出于什么原因,对象自创建后,其内部状态和数据保持绝对的稳定。

三)、不变模式的使用场景

1).当对象被创建后,其内部状态和数据不再发生任何变化。

2).对象需要共享、被多线程频繁访问。

四)、不变模式的实现

1).去除setter方法以及所有修改自身属性的方法

2).将所有属性设为私有,并用final标记

3).确保没有子类可以重载修改它的行为

4).有一个可以创建完整对象的构造函数

product类:

/**
 * 不变模式的实现:
 *
 *    Product: 产品类
 *
 *    属性:
 *    no: 序列号
 *    name: 名称
 *    price:价格
 *
 *    不变模式的要求:
 *    1.类由final修饰,没有子类重载可以改变它的行为
 *    2.属性由final修饰,确保不可改
 *    3.去除setter以及所有修改属性的方法
 *    4.有一个可以创建完整对象的构造函数
 *
 * */
//1.类名由final修饰
public final class Product {
    //2.属性由private final修饰
    private final String no;
    private final String name;
    private final double price;
    //3.没有设置setter方法

    //4.可以创建完整对象的构造函数
    public Product(String no, String name, double price) {
        this.no = no;
        this.name = name;
        this.price = price;
    }
}

五)、不变模式在JDK中的应用

JDK中,不变模式的应用非常广泛。

java.lang.String类和所有的元数据类包装类,都是使用不变模式实现的。

JDK的主要不变模式类型如下:

java.lang.Stirng

java.lang.Boolean

java.lang.Byte

java.lang.Character

java.lang.Double

java.lang.Float

java.lang.Integer

java.lang.Long

java.lang.Short

注:在多线程的环境下,不变对象是不需要进行同步操作的。

金麟岂能忍一世平凡 飞上了青天 天下还依然
原文地址:https://www.cnblogs.com/Auge/p/11703374.html