论坛首页 入门技术论坛

3种单例模式对比

浏览 3873 次
该帖已经被评为新手帖
作者 正文
   发表时间:2007-04-26  

模式一:

class Singleton2 {
 
 private Singleton2(){
 }
 
 private static Singleton2 instance;

 public static Singleton2 getInstance() {
  if(instance==null){
   instance=new Singleton2();
  }
  return instance;
 }

}
不用说,大家也知道,这种在单线程程序中是没什么问题的,但多线程程序中,则可能会创建出2个或多个对象.

模式二:

public class Singleton {
 
 private Singleton(){
  
 }
 private static Singleton instance =new Singleton();
 
 public static Singleton getInstance(){
  return instance;
 }

}
这种很显然没有前者的问题,也是值得推崇的方式.

模式三:

public class Singleton {

 private static class SingletonHolder {
  static Singleton instance = new Singleton();
 }

 public static Singleton getInstance() {
  return SingletonHolder.instance;
 }

}
这又是一种单例实现方式,但不太明白和模式二对比,那个更好一点???显然模式三多创建了一个对象.??疑问中

   发表时间:2007-04-26  
模式三是为了解决多线程下实现延迟初始化的singleton模式
0 请登录后投票
   发表时间:2007-04-26  
2楼正解!
在模式2中,不管我们是不是调用getInstance()都会存在一个实例在内存中,而在模式3中,只有我们调用了getInstance(),才会创建唯一的实例到内存中.并且也解决了模式1中多线程的问题.解决的方式是利用了Classloader的特性.
0 请登录后投票
   发表时间:2007-04-27  
《Effective Java》上有滴说~
0 请登录后投票
   发表时间:2007-04-27  
Eastsun 写道
《Effective Java》上有滴说~
恩,只展现了模式1和2
0 请登录后投票
   发表时间:2007-04-27  
模式3中的lazy initialization方法在《Effective JAVA》的线程一章里面讲到了滴说
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics