UML图:
核心作用及目标:
保证只有一个实例,并且提供一个访问该实例的全局访问点。
目标:
- 线程安全
- 调用效率高
- 懒加载
单例模式的优点:
由于单例模式只生成一个实例,减小了系统开销,当一个对象的产生需要比较多的资源时,如读取配置,产生其他依赖对象。则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。
常见的五种单例模式实现方式:
主要:
- 饿汉式(线程安全、调用效率高。不能延时加载。)
- 懒汉式(线程安全,调用率不高。可以延时加载。)
其他:
- 双重检测锁式(由于jvm底层内部模型原因,偶尔出现问题,需要加上volatile关键字)
- 静态内部类式(线程安全,调用率高。可以延时加载)
- 枚举单例(线程安全,调用率高。不能延时加载)
一、 饿汉式
package com.amberweather.instance.ht;
/**
*
* 测试饿汉式单例模式
* @author HT
*
*/
public class SingletonDemo1 {
//类初始化,立即加载这个类
//类加载时,是个天然的线程安全的地方
private static SingletonDemo1 instance = new SingletonDemo1();
private SingletonDemo1(){
}
//方法没有同步,调用效率高
public static SingletonDemo1 getInstance(){
return instance;
}
}
package com.amberweather.instance.ht;
public class htMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
SingletonDemo1 s = SingletonDemo1.getInstance();
System.out.println(s);
new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
SingletonDemo1 d = SingletonDemo1.getInstance();
System.out.println(d);
}
}).start();
}
}
二、 懒汉式
package com.amberweather.instance.ht;
public class SingletonDemo2 {
//不初始化,延时加载,整整用得时候再创建
private static SingletonDemo2 instance;
private SingletonDemo2(){}
//方法同步,调用效率低
public static synchronized SingletonDemo2 getInstance(){
if (instance == null){
instance = new SingletonDemo2();
}
return instance;
}
}
三、 双重检测锁
package com.amberweather.instance.ht;
/**
* 双重检测锁,将同步内容移到if内部,提高了执行效率 不必每次获取对象时都进行同步,只有第一次才同步。
*
* @author HT
*
*/
public class SingletonDemo3 {
// 不初始化,延时加载,整整用得时候再创建
private volatile static SingletonDemo3 instance;
private SingletonDemo3() {
}
//方法没有同步,调用效率高
public static SingletonDemo3 getInstance() {
if (instance == null) {
synchronized (SingletonDemo3.class) {
if (instance == null) {
instance = new SingletonDemo3();
}
}
}
return instance;
}
}
四、 静态内部类
package com.amberweather.instance.ht;
/**
*
* 线程安全、调用效率高、实现延迟加载
* @author HT
*
*/
public class SingletonDemo4 {
private static class SingletonClassInstance{
private static SingletonDemo4 instance= new SingletonDemo4();
}
private SingletonDemo4(){
}
public static SingletonDemo4 getInstance(){
return SingletonClassInstance.instance;
}
}
五、 枚举
package com.amberweather.instance.ht;
/**
*
* 避免反射和反序列化,调用效率高
* 不过没有延时加载
* @author Administrator
*
*/
public enum SingletonDemo5 {
//对于枚举元素,本身就是单例
INSTANCE;
//添加你需要的操作
public void singletonOperation(){
}
}
注意
除了枚举。其余单例模式都会被反射和序列化破解,要针对他们做出相应优化,这里暂时不讨论。