【笔记】高并发编程第二阶段19讲、多线程不可变对象设计模式Immutable-上
1.不可变对象,一定线程是安全的。
2.可变对象,不一定线程不安全。
String是典型的不可变对象,如下:
replace会返回一个新的对象,对string的所有操作(修改等),是返回新的值,不是同一个地址。
String方法中基本上没有加锁的地址,只有一个地方:
在构造函数时,为了访问正在拷贝时,buffer被修改。
StringBuffer有大量的synchronzed,是线程安全的,但不是不可变对象,StringBuilder不是线程安全的。
public class ImmutableTest {
private final int age;
private final String name;
private final List<String> list;
public ImmutableTest(int age, String name) {
this.age = age;
this.name = name;
list = new ArrayList<>();
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public List<String> getList() {
return list;
}
}
—这个不是不可变对象,因为一旦getList()后,即拿到list,就可以修改list里的值了,可以修改下getList方法:
public List<String> getList() {
return Collections.unmodifiableList(list);
}