懒汉
/**
* 单例模式--懒汉
* 1.创建私有化构造函数
* 2.创建静态单例提供函数
* 3.创建私有化静态唯一实例对象
*/
public class Singleton {
private static Singleton single= new Singleton();
private Singleton(){
}
public static Singleton getInstance(){
return single ;
}
}
在类加载时就创建了实例对象,浪费内存资源!线程安全!
饿汉(线程不安全)
/**
* 单例模式--饿汉(线程不安全)
* 1.创建私有化构造函数
* 2.创建静态单例提供函数
* 3.在单例提供函数中判断是否第一次使用,创建私有化静态唯一实例对象
* 4.实例对象成员变量初始值为null
*/
public class Singleton {
private static Singleton single= null;
private Singleton(){
}
public static Singleton getInstance(){
if(single == null){
single = new Singleton();
}
return single ;
}
}
内存资源合理运用!线程不安全!
饿汉(同步方法)
/**
* 单例模式--饿汉(同步方法)
* 1.创建私有化构造函数
* 2.创建静态单例提供函数
* 3.在单例提供函数中判断是否第一次使用,创建私有化静态唯一实例对象
* 4.实例对象成员变量初始值为null
* 5.同步方法 synchronized
*/
public class Singleton {
private static Singleton single= null;
private Singleton(){
}
public static synchronized Singleton getInstance(){
if(single == null){
single = new Singleton();
}
return single ;
}
}
将提供方法设置为同步方法,解决了线程安全问题,但是每次调用同步方法时都需要进行同步,造成不必要的同步开销!
饿汉(同步锁)
/**
* 单例模式--饿汉
* 1.创建私有化构造函数
* 2.创建静态单例提供函数
* 3.在单例提供函数中判断是否第一次使用,创建私有化静态唯一实例对象
* 4.实例对象成员变量初始值为null
* 5.同步锁
*/
public class Singleton {
private static Singleton single= null;
private Singleton(){
}
public static Singleton getInstance(){
if(single == null){
synchronized (Singleton.class) {
if(single == null){
single = new Singleton();
}
}
}
return single ;
}
}
枚举
public enum Singleton {
INSTANCE;
}
枚举类就是单例模式。