一、饿汉式单例
饿汉式单例:在使用该类的静态成员时,无论有没有使用单例类,都会创建单例对象
代码语言:javascript复制/**
* 饿汉式单例:在使用该类的静态成员时,无论有没有使用单例类,都会创建单例对象
*
* @author wangpeng
*
*/
public class Singleton {
private Singleton() {
// TODO Auto-generated constructor stub
System.out.println("Singleton is create");
}
public static int staticMember = 0;
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
public static void createString() {
System.out.println("createString in Singleton");
}
public static void main(String[] args) {
// 输出Singleton is create和createString in Singleton
Singleton.staticMember = 1;
// Singleton.createString();
}
}
二、懒汉式单例
懒汉式单例:通过判断单例对象是否为null和加同步关键字,保证只在第一次使用单例类创建单例类,避免创建重量级单例类慢的问题。在高并发情况下,同步关键字的使用可能会降低性能
代码语言:javascript复制/**
* 懒汉式单例:通过判断单例对象是否为null和加同步关键字,保证只在第一次使用单例类创建单例类,避免创建重量级单例类慢的问题。在高并发情况下,同步关键字的使用可能会降低性能
*
* @author wangpeng
*
*/
public class LazySingleton {
private LazySingleton() {
System.out.println("LazySingleton is create");
}
public static int staticMember = 0;
private static LazySingleton instance = null;
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
public static void createString() {
System.out.println("createString in Singleton");
}
public static void main(String[] args) {
// 只输出createString in Singleton
LazySingleton.staticMember = 1;
LazySingleton.createString();
}
}
三、内部类单例
使用内部类来实现单例:(1)由于类加载是单线程的,故可以替代synchronized关键字解决并发问题。 (2)当单例类加载时,其内部类不会初始化。只当调用getInstance方法时,才会创建单例类
代码语言:javascript复制/**
* 使用内部类来实现单例:(1)由于类加载是单线程的,故可以替代synchronized关键字解决并发问题。
* (2)当单例类加载时,其内部类不会初始化。只当调用getInstance方法时,才会创建单例类
*
* @author wangpeng
*
*/
public class StaticSingleton {
private StaticSingleton() {
// TODO Auto-generated constructor stub
System.out.println("StaticSingleton is create");
}
/**
* 持有单例对象的内部类
*/
private static class SingletonHolder {
private static StaticSingleton instance = new StaticSingleton();
}
public static StaticSingleton getInstance() {
return SingletonHolder.instance;
}
public static void createString() {
System.out.println("createString in Singleton");
}
public static void main(String[] args) {
StaticSingleton.getInstance();
}
}