不变模式
一)、不变模式的概述
使用场景: 当多线程对同一个对象进行读写操作时,为保证对象数据的一致性和正确性,有必要对对象进行同步。
作用: 确保在没有同步操作的多线程环境中,保持对象内部状态的一致性和正确性
核心思想:一个对象一旦被创建,则它的内部状态将永远不会改变,同时,其内部状态也决不会自行发生改变。
二)、不变模式与只读属性的区别
只读属性:对象本身不能被其他线程修改, 对象的自身状态却可能自行修改。
不变模式:没有一个线程可以修改其内部结构和数据,同时,其内部状态也 不会自行改变,即自对象创建后,内部状态和数据保持绝对的稳定。
只读属性举例:
一个对象的存活时间(对象的创建时间和当前时间的时间差)是只读的,因为任何一个第三方线程都不能修改这个属性,因为随着时间的推移,存活时刻都在发生变化,并不满足不变模式的要求,无论出于什么原因,对象自创建后,其内部状态和数据保持绝对的稳定。
三)、不变模式的使用场景
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
注:在多线程的环境下,不变对象是不需要进行同步操作的。