3.4不可变性
不可变对象,对象创建后,其状态就不可改变,状态指,成员变量的值。
满足以下条件的对象才是不可变对象:
1、对象的所有成员对象都是final
2、对象被正确的创建
3.4.1、对象的域(成员变量)尽量声明为final,会减少对象的可变状态。
除非需要可变,否则所有域(成员变量)都声明为final,为好的编程习惯。
3.4.2、用volatile来发布不可变对象
3.5安全发布
发布:多个线程共享对象的某个或某几个成员变量
3.5.1、不正确的发布,可以导致某个成员对象还没有被创建完成,就被其他线程直接拿来用。
3.5.2、java内存模型为final不可变对象提供了一种安全的初始化模型。
多个线程任何线程都可以安全的共同访问不可变对象以及可变对象的不可变成员变量。
3.5.3安全的发布对象(将对象置为public)
1、将对象初始化放入static修饰的作用域中。
2、将对象用final、volitile、AtmoicRefer修饰
3、用锁保护
4、将对象放入容器中
3.5.4 如果一个对象时可变的,但程序运行过程中不会改变,那么他可以成为事实上的不可变对象。
3.5.5 可变对象的安全,分为初始化安全,和使用过程中的安全。
发布:对象初始化。
多线程安全初始化对象的方法:
1、在静态函数中初始化
2、将对象的引用用volitile和atmoicRefer修饰
3、将对象的引用用final修饰。
4、对象的引用保存到一个由锁保护的地方。
共享对象的一些实用策略:
1、线程封闭,对象只由1个线程使用。
2、只读共享,对象或对象的所有状态是final的。
3、锁保护
4、线程安全共享,对象的内部对象为private,暴露public函数,同步在对象的内部实现。多个线程由对象的公共接口访问该对象。