package com.bjsxt.cn.singleton;
/**
* 饿汉式创建单例模型
* 饿汉式单例模型的特点:
* 1, 私有的该类对象静态属性
* 2, 私有的构造器
* 3, 公共的静态方法访问静态属性(因此需要时静态的环境)
* @author wanna
*
*/
public class SingletonDemo1 {
//饿汉式,饿,非常饿,上来就吃了
//类初始化的时候,立即加载这个对象(没有延时加载的能力)。如果加载该类非常复杂,而在之后却又并没有访问该对象,造成资源的狼粪
//由于加载类是天然线程安全的,所以饿汉式单例模式线程安全
private static SingletonDemo1 instance = new SingletonDemo1();
private SingletonDemo1() {
}
//该访问方法没有同步synchronized,因此调用效率高
public static SingletonDemo1 getInstance() {
return instance;
} }
package com.bjsxt.cn.singleton;
/**
* 2015年3月26日22:14:30
* 懒汉式单例模式
* 该懒汉式的特点是:
* 1, 构造器私有
* 2, 私有静态属性,类型为该类的对象,但是在声明时并没有初始化。因为Lazy load。因为懒惰
* 3, 静态访问私有的那个静态属性的静态方法。但是在该方法体中先要检查该静态属性是否为空,为空则new,否则直接返回
*
* @author wanna
*
*/
public class SingletonDemo2 {
private SingletonDemo2() {
}
private static SingletonDemo2 instance;
//因为该方法加了同步synchronized,效率低,但是具有延时加载的能力。提高了资源的利用率
public static synchronized SingletonDemo2 getInstance() {
if (instance == null) {
instance = new SingletonDemo2();
}
return instance;
}
}
package com.bjsxt.cn.singleton;
/**
* 2015年3月26日22:14:38
*
* 测试双重检测锁式单例模式
* 双重检测锁式单例模式的特点与懒汉式相似,但最重要的区别是在访问静态属性的实例时的过程
*
* 但是由于编译器底层优化和JVM内部模型,偶尔会出问题,不建议使用
* @author wanna
*
*/
public class SingletonDemo3 {
private static SingletonDemo3 instance = null;
private SingletonDemo3() {
}
//该方法把懒汉式单例模式中的synchronized同步下移到if中,提高了执行效率,不用每次获取对象时都需要进行同步。
//只有第一次创建需要同步,之后就不需要了。
public static SingletonDemo3 getInstance() {
if (instance == null) {
SingletonDemo3 sc;
synchronized(SingletonDemo3.class) {
sc = instance;
if (sc == null) {
synchronized(SingletonDemo3.class) {
if (sc == null) {
sc = new SingletonDemo3();
}
}
instance = sc;
}
}
}
return instance;
}
}
package com.bjsxt.cn.singleton;
/**
* 2015年3月26日22:14:45
* 静态内部类实现单例模式
* 这种方式线程安全,执行效率高,并且可以延时加载
* 特点:
* 1, 构造器私有
* 2, 静态属性修改为静态内部类,在内部类中定义了外部类的静态final属性(好像删去final也不影响)
* 3, 静态访问静态属性的方法,在方法体重返回在内部类new出来的外部封装类对象。也就实现了延时加载
* @author wanna
*
*/
public class SingletonDemo4 {
private static class SingltonClassInstance {
private static SingletonDemo4 instance = new SingletonDemo4();
}
public static SingletonDemo4 getInstance() {
return SingltonClassInstance.instance;
}
private SingletonDemo4() {
}
}
package com.bjsxt.cn.singleton;
/**
* 测试枚举实现单例模式(没有延时加载)
* @author wanna
*
*/
public enum SingletonDemo5 {
Instance;//该枚举元素本身就是单例对象
//添加自己需要的操作
public void operation() {
}
}
原文:http://blog.csdn.net/lk142500/article/details/44657951