Ensure a class only has one instance,and provide a global point of access to it.
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
单例模式主要是为了避免因为创建了多个实例造成资源的浪费,且多个实例由于多次调用容易导致结果出现错误,而使用单例模式能够保证整个应用中有且只有一个实例。
public class SingletonEHan {
private SingletonEHan() {}
/**
* 1.单例模式的饿汉式[可用]
*/
private static SingletonEHan singletonEHan = new SingletonEHan();
public static SingletonEHan getInstance() {
return singletonEHan;
}
// SingletonEHan instance= SingletonEHan.getInstance();
/**
* 2. 单例模式的饿汉式变换写法[可用]
* 基本没区别
*/
private static SingletonEHan singletonEHanTwo = null;
static {
singletonEHanTwo = new SingletonEHan();
}
public static SingletonEHan getSingletonEHan() {
if (singletonEHanTwo == null) {
singletonEHanTwo = new SingletonEHan();
}
return singletonEHanTwo;
}
// SingletonEHan instance= SingletonEHan.getSingletonEHan();
}
}
- 内部类[推荐用]:
/**
优点:避免了线程不安全,延迟加载,效率高。
*/
public class SingletonIn {
private SingletonIn() {
}
private static class SingletonInHodler {
private static SingletonIn singletonIn = new SingletonIn();
}
/**
* . 枚举[极推荐使用]
*
* 这里SingletonEnum.instance
* 这里的instance即为SingletonEnum类型的引用所以得到它就可以调用枚举中的方法了。
借助JDK1.5中添加的枚举来实现单例模式。不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象
*/
public enum SingletonEnum {
instance;
private SingletonEnum() {
}
public void whateverMethod() {
}
// SingletonEnum.instance.method();
}
-双重检验模式
class Singleton{
private static volatile Singleton singleton;
private Singleton(){}
public static Singleton getInstance(){
if(singleton == null){
synchronized(Singleton.class){
singleton = new Singleton(); //1
}
}
return singleton;
}
}
原文:https://www.cnblogs.com/xiaohua7988/p/11616574.html