单件模式
第五个模式:单件模式
5.1问题引入:
有一些对象我们其实只需要一个,比方说:线程池,缓存,对话框,处理偏好设置和注册表的对象,日志对象,充当打印机、显卡等设备的驱动程序的对象。
5.2解决方案1:
单件模式:确保一个类只有一个实例,并提供一个全局访问点
让我们来看看代码:getInstance()是静态的,这意味着它是一个类方法,所以可以在代码的任何地方使用Singleton.getInstance()访问它。这和访问全局变量一样简单,只是多了一个优点:单件可以延迟实例化。
缺点:会造成线程不安全!
解决办法:只要把getInstance()方法编程同步的(synchronized)方法,多线程灾难几乎可以轻易地解决了;但是,只有第一次执行此方法时,才真正需要同步。换句话说,一旦设置好了uniqueInstance变量,就不再需要同步这个方法了。之后每次调用这个方法时,同步都是一种累赘。
解决办法:
1.如果getInstance()的性能对应用程序不是很关键,就什么都别做;
2.使用“急切”创建实例,而不用延迟实例化方法;
3.用“双重检查加锁”,在getInstance()中减少使用同步;