在并行软件开发过程中,同步操作是必不可少的。当多线程对同一个对象进行读写操作时,为了保证对象数据的一致性和正确性,有必要对对象进行同步操作,但同步操作对系统性能有损耗。
不变模式可以去除这些同步操作,提高并行程序性能,确保其在没有同步操作的多线程环境中保持内部状态的一致性鄂汇正确性。
不变模式的主要使用场景需要满足如下两个条件:
当对象创建后,其内部状态和数据不再发生任何变化。
对象需要被共享,被多线程频繁访问。
为确保对象被创建后,不发生任何改变,并保证不变模式正常工作,需要注意四点:
去除setter方法及所有修改自身属性的方法。
将所有属性设置为私有,并用final标记,确保其不可修改。
确保没有子类可以重载修改它的行为。
有一个可以创建完整对象的构造方法。
/**
* @author lyonardo
* @Description 不变模式
* @createTime 2020年01月11日 11:41:00
*/
public final class Product {//确保物资类
private final String no;//私有属性,不会被其他对象获取
private final String name;//final保证属性不会被两次赋值
private final double price;
//创建对象时,必须指定数据;因为创建后,无法尽心修改
public Product(String no, String name, double price) {
this.no = no;
this.name = name;
this.price = price;
}
public String getNo() {
return no;
}
public String getName() {
return name;
}
public double getPrice() {
return price;
}
}
注意:不变模式通过回避问题而不是解决问题的态度处理多线程并发访问控制,不变对象不需要进行同步操作。由于并发同步会对性能产生不良影响,因此,在需求允许的情况下,不变模式可以提高系统的并发性能和并发量。