如何在Java中实现单例模式?

如题所述

单例模式大致有五种写法,分别为懒汉,恶汉,静态内部类,枚举和双重校验锁。

1、懒汉写法,常用写法

class LazySingleton{
    private static LazySingleton singleton;
    private LazySingleton(){
    }
    public static LazySingleton getInstance(){
        if(singleton==null){
            singleton=new LazySingleton();
        }
        return singleton;
    }   
}

2、恶汉写法,缺点是没有达到lazy loading的效果

class HungrySingleton{
    private static HungrySingleton singleton=new HungrySingleton();
    private HungrySingleton(){}
    public static HungrySingleton getInstance(){
        return singleton;
    }
}

3、静态内部类,优点:加载时不会初始化静态变量INSTANCE,因为没有主动使用,达到Lazy loading

class InternalSingleton{
    private static class SingletonHolder{
        private final static  InternalSingleton INSTANCE=new InternalSingleton();
    }   
    private InternalSingleton(){}
    public static InternalSingleton getInstance(){
        return SingletonHolder.INSTANCE;
    }
}

4、枚举,优点:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象

enum EnumSingleton{
    INSTANCE;
    public void doSomeThing(){
    }
}

5、双重校验锁,在当前的内存模型中无效

class LockSingleton{
    private volatile static LockSingleton singleton;
    private LockSingleton(){}
     
    //详见:http://www.ibm.com/developerworks/cn/java/j-dcl.html
    public static LockSingleton getInstance(){
        if(singleton==null){
            synchronized(LockSingleton.class){
                if(singleton==null){
                    singleton=new LockSingleton();
                }
            }
        }
        return singleton;
    }
}

参考自:http://www.oschina.net/code/snippet_107039_6062

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-10-22
  单例模式能如上面代码中的实现方式,最主要依赖于我们可以在私有的构造器中完成初始化的任务,而需要延迟或是从外部获取相关的参数。否则,我们就必须要采取延迟初始化的方式,一种典型实现方式的代码如下:
public class Configuration {
  private static final Configuration instance = null;
  private Configuration() {
  // init  }
  public static Configuration getInstnace() {
  if (instance == null) {
  instance = new Configuration();  }
  return instance;  }
  // .. other methods  }
  注意getInstance方法,我们增加了一个if语句来实现延长初始化和只初始化一次。这段代码在单线程的情况下是没有问题的,但如果放在多线程中,就有可能产生多个Configuration实例了,从而破坏单例模式,是系统可能产生数据不一致的结果。如果解决在多线程里的问题,我们在下一篇文章中再为大家分析。
,本站保留追究责任的权利。  本回答被提问者和网友采纳

如何在Java中实现单例模式?
单例模式大致有五种写法,分别为懒汉,恶汉,静态内部类,枚举和双重校验锁。1、懒汉写法,常用写法 class LazySingleton{ private static LazySingleton singleton; private LazySingleton(){ } public static LazySingleton getInstance(){ if(singleton==null){ singleton=new LazySinglet...

单例模式单例模式实例
C#中实现单例模式类似,确保实例唯一性并提供全局访问点。csharp \/\/ 用法说明 \/\/ 保证一个类仅有一个实例,并提供一个访问它的全局访问点

如何实现单例模式
单例模式实现方式有以下五种:1、饿汉模式。线程安全,调用效率高,不能延时加载。2、懒汉模式。线程安全,调用效率不高,能延时加载。3、双重检测锁模式。由因JVM底层模型原因,偶尔会出问题,不建议使用。4、静态内部类式。线程安全,调用效率高,可以延时加载。5、枚举类。线程安全,调用效率高,不能...

如何实现单例模式?
该方法是唯一可以访问类来创建实例的方法。下面是单例的一个例子:Java代码publicclassSingletonPattern{privatestaticSingletonPatterninstance;privateSingletonPattern(){}publicstaticsynchronizedSingletonPatterngetInstance(){if(instance==null){instance=newSingletonPattern();}returninstance;}}当我们要实现单例...

面试突击50:单例模式有几种写法?
1.饿汉模式饿汉模式也叫预加载模式,它是在类加载时直接创建并初始化单例对象,所以它并不存在线程安全的问题。它是依靠 ClassLoader 类机制,在程序启动时只加载一次,因此不存在线程安全问题,它的实现代码如下:public class Singleton {\/\/ 1.防止外部直接 new 对象破坏单例模式private Singleton() {...

么是单例模式,并写出单例模式的2种实现方式。
1,一个类只能有一个实例 2,自己创建这个实例 3,整个系统都要使用这个实例 Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。在很多操作中,比如建立目录 数据库连接都需要这样的单线程操作。一些资源管理器常常设计成单例模式。外部资源:譬如每台计算机可以有若干个打印机,...

如何写一个标准的Java单例模式
1、单例类只能有一个实例。2、单例类必须自己自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或...

如何在Java中使用双重检查锁实现单例
在去参加任何Java面试之前,要练习手写双重检查锁实现单例类。这将增强你发现Java程序员们所犯编码错误的洞察力。另外,在现在的测试驱动开发中,单例模式由于难以被模拟其行为而被视为反模式(anti pattern),所以如果你是测试驱动开发的开发者,最好避免使用单例模式。转载,仅供参考。

如何写一个简单的单例模式?
一、基本的实现思路:单例的实现主要是通过以下两个步骤:1、将该类的构造方法定义为私有方法,这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;2、在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回...

java单例设计模式?
举个例子:通过调用getInstance()方法来创建实例。其他不一一举例,仅供参考!希望对你有帮助 设计模式之单例模式单例设计模式理解起来非常简单。一个类只允许创建一个对象(或者实例),那这个类就是一个单例类,这种设计模式就叫单例模式。下面的示例中如果每个类都创建一个Logger实例,就可能造成日志...

相似回答