多线程对同一个对象进行操作时,为了保证对象数据的一致性和准确性,需要做相应的同步,来保证原子性,有序性以及可见性。不过这是因为被访问的对象是可变的,所以才需要各种手段去保证线程安全,试想下,如果对象一开始就是不可变的,那么是不是就意味着这个对象就是线程安全的,而无需额外的手段保证呢,答案是肯定的,String类就是一个很好的例子。
可以把保证对象不可变的这种方式称为不变模式,它的核心就在于,一旦对象被创建了,那么这个对象的内部状态和数据就永远都不会改变。
什么场景适用于不变模式?
对象被创建出来后,其内部的状态和数据不会再发生变化了,这个得根据业务实际情况确定。
这个对象会被多线程访问,是个需要共享的对象。
怎么创建不变对象?
- 构造函数要完整
- 去除掉所有可以修改自身属性的方法,比如setter
- 把属性设置为私有以及用final关键字修饰,防止被修改
- 用final关键字修饰该对象所属的类,确保其不能被继承
不变对象demo:
/**
* final修饰,确保其没有子类
*/
public final class Employee {
/**
* 一个完整的构造方法
*
* @param name
* @param age
*/
public Employee(String name, String age) {
this.name = name;
this.age = age;
}
/**
* final修饰字段,保证其不可变
*/
private final String name;
private final String age;
/**
* 只提供get方法
*
* @return
*/
public String getName() {
return name;
}
public String getAge() {
return age;
}
}