发布和逸出
“发布”一个对象的意思是指,是对象能够在当前作用域之外的代码中使用。当某个不该发布的对象被发布时,这种情况就被称为逸出。
线程封闭
当访问共享的可变数据时,通常需要使用同步。一种避免使用同步的方式是不共享数据。如果仅在单线程内访问数据,就不需要同步。这种技术就做线程封闭。
ad-hoc线程封闭:维护线程封闭性的职责完全由程序实现来承担。
栈封闭:只能通过局部变量才能访问对象。
不变性
满足同步需求的另一种方法就是使用不可变对象。
如果某个对象在被创建以后其状态就不能被修改,那么这个对象就称为不可变对象。不可变对象一定是线程安全的。
对象不可变性不等于将对象中所有的域都声明为final类型,即是对象中所有的域都是final类型的,这个对象也仍然是可变的,因为在final类型的域中可以保存对可变对象的引用。
对象不可变满足:
- 对象创建以后其状态就不能修改
- 对象的所有域都是final类型
- 对象是正确创建的(在对象的创建期间,this引用没有逸出)
正如“除非需要更高的可见性,否则应将所有的域都声明为私有域是一个良好的习惯,”除非需要某个域可变,否则应将其声明为final域"也是一个良好的编程习惯