【笔记】高并发编程第二阶段19讲、多线程不可变对象设计模式Immutable-上

1.不可变对象,一定线程是安全的。
2.可变对象,不一定线程不安全。

String是典型的不可变对象,如下:

【笔记】高并发编程第二阶段19讲、多线程不可变对象设计模式Immutable-上

replace会返回一个新的对象,对string的所有操作(修改等),是返回新的值,不是同一个地址。

【笔记】高并发编程第二阶段19讲、多线程不可变对象设计模式Immutable-上
String方法中基本上没有加锁的地址,只有一个地方:
【笔记】高并发编程第二阶段19讲、多线程不可变对象设计模式Immutable-上
在构造函数时,为了访问正在拷贝时,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);
    }