设计原则
在编程中,我们必须要假设一点,就是其他程序员会以各种稀奇古怪的方式来使用我们编写的类。
-
不暴露一切不需要暴露的字段。向外界提供本对象所引用的内部对象的引用时一定要小心。必要的话克隆一份(保护性副本)给他而不是直接给出引用。
-
使用工厂方法而非构造函数来初始化对象。防止this引用在构造过程中逸出。
新手程序员常犯的一个错误就是在构造函数里完成一堆事情而且也不注意先后顺序。会导致构造函数没有完成前,别的线程已经对这个对象可见了(比如提前将本实例的引用写入到别的对象中)。推荐是构造函数绝对不对外发布任何本实例的引用。对外发布由工厂方法完成。工厂方法完成调用构造函数,发布对象和后续处理(如启动新的线程等等)。 -
使用栈封闭(仅通过局部对象生成和使用对象)或者ThreadLocal的方式达成线程封闭的要求(即保证某个对象永远只能被一个线程访问到。
-
不可变对象一定是线程安全的。
-
使用JAVA监视器模式———把对象的所有可变状态都封装起来。仅允许通过提供的公开方法来执行。所有的公开方法都是由synchronized关键字修饰的。典型例子是Vector和Hashtable。
常见的问题及其解决方案
- 死锁
- 线程饥饿死锁