并发情况下如果对一个共享变量进行读写就会有并发问题,如果只有读是没有并发问题的,所以解决并发问题的一个重要思路就是不提供变量的写的功能
如何快速实现不可变类
- 类的声明以及属性都要声明成final对象(类的声明是为了防止子类继承父类修改父类的属性)
- 只提供只读的方法,如果要修改对象,去创建一个新的不可变对象。
例如String,是典型的一个不可变对象,String中的replace对象在修改时候我们是创建了一个新的不可变对象
利用flyweight模式减少重复对象的创建
由于不可变对象不能修改,如果遇到修改话可能会产生大量的对象占用系统内存,为了避免这种情况发生JAVA采用了flyweight模式来减少对象的产生,用一句话概述
提前缓存好一部分对象,如果没有在去创建,如果有就直接取用,因为这些对象是不可变的共享完全没问题。
比较特殊的是Long,因为对象范围比较大,所以Long只保存了-128-127的对象。具体见代码
1 | Long valueOf(long l) { |
注意事项
不可变对象的属性即时声明了不可变,但是他的属性也有可能改变如下
1 | //Foo 线程安全 |
不可变类作为属性本身不具备不可见性并且是线程不安全的
1 | //Foo 线程安全 |