1.单例模式 恶汉式
特点:天生线程安全,效率高,但是不能延迟加载
package com.wangyu;
/**
* 单例模式 恶汉式
* 特点:天生线程安全,效率高,但是不能延迟加载
* @author zjmiec
*
*/
public class SingletonDemo1 {
// 类初始化立即加载
private static SingletonDemo1 instance = new SingletonDemo1();
private SingletonDemo1() {}
public static SingletonDemo1 getInstance() {
return instance;
}
}
2. 单例模式 懒汉式
package com.wangyu;
import com.sun.corba.se.impl.orbutil.concurrent.Sync;
/**
* 单例模式 懒汉式 特点,效率低,支持延迟加载 资源利用率高了,但是并发效率低 synchronized 要同步
*
* @author zjmiec
*
*/
public class SingletonDemo2 {
// 类初始化不会立即加载,用到的时候创建
private static SingletonDemo2 instance;
private SingletonDemo2() {
}
public static synchronized SingletonDemo2 getInstance() {
if (instance == null) {
instance = new SingletonDemo2();
}
return instance;
}
}
3. 双重锁机制实现单例模式
package com.wangyu;
/**
*
* 双重锁机制实现单例模式 (由于jvm底层优化,使用过程会出现问题不建议使用)
*
* @author zjmiec
*
*/
public class SingletonDemo3 {
// 类初始化不会立即加载,用到的时候创建
private static SingletonDemo3 instance = null;
private SingletonDemo3() {
}
public static synchronized 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;
}
}
4.静态内部类方式实单例模式
package com.wangyu;
/**
*
* 静态内部类方式实单例模式
* 特点:
* 没有static属性,不会像恶汉模式立即加载 只有真正调用的geiInstance,
* 才会加载静态内部类,且加载过程线程安全
* instances是 static final类型,保证内存中只有一个实例,
* 而且只能被赋值一次 保证线程安全,同时兼备并发高效和延迟加载的优势
*
* @author zjmiec
*
*/
public class SingletonDemo4 {
private static class SingletonClassInstance {
private static final SingletonDemo4 instance =new SingletonDemo4();
}
private SingletonDemo4() {
}
public SingletonDemo4 getInstance(){
return SingletonClassInstance.instance;
}
}
5.枚举方式实现单利模式
package com.wangyu;
/**
* 枚举方式实现单利模式(没有延迟加载的属性)
* 线程安全调用效率高
* @author zjmiec
*
*/
public enum SingletonDemo5 {
// 这个枚举元素,本身就是单例
INSTANCE;
//添加自己的操作
public void singletonOperation() {
}
}
测试:
对比总结:
常见的五种单例模式实现方式
一主要:
------饿汉式(线程安全,调用效率高。 但是,不能延时加载。 )。
------懒汉式(线程安全,调用效率不高。但是,可以延时加载。 )
一其他:
------双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题。不建议使用)。
------静态内部类式(线程安全,调用效率高。但是,可以延时加载)
------枚举式(线程安全,调用效率高,不能延时加载。并且可以天然的防止反射和反序列化漏洞!)
如何选用?
-------单例对象占用资源少,不需要延时加载:
枚举式好于饿汉式
------单例对象占用资源大,需要延时加载:
静态内部类式 好于懒汉式