通过某个类创建对象时,在整个程序中,只能创建一个对象,这种类称为单例类。
饿汉式(类一旦加载,单例就初始化完成,保证调用getInstance的时候,单例已经存在)
单例类会一直占用资源
package com.javawu.singleton;
public class Singleton{
private static Singleton singleton= new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return singleton;
}
}
懒汉式(延迟加载,调用getInstance的时候才回去初始化这个单例)
package com.javawu.singleton;
public class Singleton{
#2.声明类的静态变量(静态变量跟对象无关)
private static Singleton singleton = null;
#1.使用private修饰默认的构造方法(类外部不能使用new创建对象)
private Singleton () {
// TODO 自动生成的构造函数存根
}
#3.创建返回对象的方法
#4.判断,对象存在不再创建
#5.(1)为了保证线程同步,改为同步方法(每次调用都会做线程同步)
public static synchronized Singleton getInstance() {
if(singleton == null) {
singleton = new Singleton ();
}
return singleton;
}
#5.(2)双重检查锁定(和1相比只有第一次调用单例的时候才会做线程同步)
//使用双重检查锁定,signleton需要用volatile修饰
//即 private volatile static Singleton sigleton = null;
//详见:http://www.iteye.com/topic/652440
public static Singleton getInstance() {
if(singleton == null) {
synchronized(Singleton.class) {
if(singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
#5.(3)静态内部类(3种延迟加载方式中最优的)
public static Singleton getInstance() {
private static class Holder {
private static final Singleton instance = new Singleton();
}
private Singleton() {
}
public static final Singleton getInstance() {
return Holder.instance;
}
}
}
据称还有一个最佳的单例实现方法--单个成员的枚举
package com.javawu.singleton;
public enum Singleton {
//定义一个枚举元素
instacnce;
//这个单例类具有的方法
public void method() {
}
}