一) 什么是单件模式
很简单,使代码只能实例化一个实例的设计模式。怎么做,看个典型样例:
[img]http://dl.iteye.com/upload/attachment/0063/3293/e5286adf-b52d-3037-964f-e9cec416a8f8.png[/img]
如上图,把握3个注意点吧:
1)uniqueInstance 必须用 private static 修饰
2)构造函数必须 private
3)函数getInstance() 必须 static
二)单件模式的多线程处理
显然,以上单件模式的代码不支持多线程。(如何多线程冲突的这里就不多解释了,出问题的就是:if( uniqueInstance == null) { uniqueInstance = new Singleton(); } 这句啦 )
解决方法也很简单,在函数getInstance()前增加线程保护:synchronized 就ok啦
三)多线程单件模式的优化原则
多线程的处理是十分简单,但它也带来性能降低的问题。如何优化? 原则有三:
1)如果性能对应用程序不是很重要,忘了优化吧,就这样吧~~哈哈
2)采用急切创建实例:
[img]http://dl.iteye.com/upload/attachment/0063/3302/69a54b6b-434e-3125-9437-44cd9188a64d.png[/img]
3)三重检查加锁:
[img]http://dl.iteye.com/upload/attachment/0063/3305/2559c2cb-71a8-3de5-bab3-8b7fc5fdd89b.png[/img]
这个方案要特别注意哦:
1、volatile修饰符哦。
2、不适用于1.4及更早的java版本
很简单,使代码只能实例化一个实例的设计模式。怎么做,看个典型样例:
[img]http://dl.iteye.com/upload/attachment/0063/3293/e5286adf-b52d-3037-964f-e9cec416a8f8.png[/img]
如上图,把握3个注意点吧:
1)uniqueInstance 必须用 private static 修饰
2)构造函数必须 private
3)函数getInstance() 必须 static
二)单件模式的多线程处理
显然,以上单件模式的代码不支持多线程。(如何多线程冲突的这里就不多解释了,出问题的就是:if( uniqueInstance == null) { uniqueInstance = new Singleton(); } 这句啦 )
解决方法也很简单,在函数getInstance()前增加线程保护:synchronized 就ok啦
三)多线程单件模式的优化原则
多线程的处理是十分简单,但它也带来性能降低的问题。如何优化? 原则有三:
1)如果性能对应用程序不是很重要,忘了优化吧,就这样吧~~哈哈
2)采用急切创建实例:
[img]http://dl.iteye.com/upload/attachment/0063/3302/69a54b6b-434e-3125-9437-44cd9188a64d.png[/img]
3)三重检查加锁:
[img]http://dl.iteye.com/upload/attachment/0063/3305/2559c2cb-71a8-3de5-bab3-8b7fc5fdd89b.png[/img]
这个方案要特别注意哦:
1、volatile修饰符哦。
2、不适用于1.4及更早的java版本