package 设计模式.创建型.单例模式.简单单例模式饿汉;
/**
* @Title:简单单例模式
* 一般用在log日志上使用(相当于是高级版的静态常量。带懒初始化功能。)
* 只需要使用一个单独的资源,并且需要共享这个单独资源的状态信息时,就能用到单例模式。
* @author: gun
*2018-1-12上午10:46:23
*/
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
// Private constructor suppresses
private Singleton() {}
// default public constructor
public static Singleton getInstance() {
return INSTANCE;
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println(INSTANCE);
}
}
}
package 设计模式.创建型.单例模式.多线程懒汉模式2;
/**
* @Title:多线程懒汉模式 //不推荐,因为在多线程下很容易引起并发问题
* @author: gun
*2018-1-12上午10:53:55
*/
public class Singleton {
// Private constructor suppresses
private Singleton() {
}
private static class LazyHolder {
static final Singleton INSTANCE = new Singleton();//这里和饿汉的区别就是 这里是需要调用的时候才会创建
}
public static Singleton getInstance() {
return LazyHolder.INSTANCE;
}
}
package 设计模式.创建型.单例模式.多线程懒汉模式推荐;
/**
* @Title: 多线程的懒汉模式 (维基百科推荐)
* 在Java编程语言中,单例模式(懒汉模式)应用的例子如下述代码所示
* (此种方法只能用在JDK5及以后版本(注意 INSTANCE 被声明为 volatile),之前的版本使用“双重检查锁”会发生非预期行为[1]):
* @author: gun
*2018-1-12上午10:52:24
*/
public class Singleton {
private static volatile Singleton INSTANCE = null;
private Singleton() {}
//线程安全和性能提升
public static Singleton getInstance() {
if(INSTANCE == null){
synchronized(Singleton.class){
//当两个以上的线程同时运行到第一个null检查时,为了避免再次出现超过一次的情况,需要再次检查它。
if(INSTANCE == null){
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}