java的单例模式

来源:互联网 发布:人脸识别算法 开源 编辑:程序博客网 时间:2024/04/30 12:17

单例模式核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点

单例模式的优点:由于单例模式只生成一个实例,减小了系统的开销,当一个对象的产生需要比较多的资源时,如读取配置产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。

主要的单例模式有饿汉式、懒汉式、静态内部类式单例模式。

其中饿汉式模式代码为:

package com.饿汉式模式;
/*
 * 特点:线程安全,调用效率高,但不能延迟加载
 * 优点:饿汉式单例模式代码中,static变量会在类装载时初始化,
 *      此时也不会涉及到多个线程对象同时访问该对象的问题,
 *      虚拟机保证只会装载一次该类,肯定不会发生并发访问的问题,
 *      因此可以省略synchrnized关键字
 * 缺点:如果只是加载本类,而没有使用getInstance方法获取该类的对象
 *      甚至永远没有使用到该类的话,则会造成资源的浪费
 * 
 */
public class SingletonDemo {


private static SingletonDemo intance = new SingletonDemo();
//私有的构造方法
private SingletonDemo(){
}
//可以省略synchronized
//因为方法没有同步,所以调用效率高
public static /*synchronized*/ SingletonDemo getIntence(){
return intance;
}
}

懒汉模式为:

package com.懒汉式模式;
/*
 *特点:线程安全,执行效率不高,但可以实现延迟加载
 *资源利用率高,但getIntance方法并发效率低
 *
 */
public class SingletonDemo {


//初始化时并没有急于直接创建对象,而是在真正用到的时候才去加载
private static SingletonDemo intance;
private SingletonDemo(){
//加这个if语句的作用就是避免反射漏洞
if(intance!=null)
throw new RuntimeException();
}
//为了保证线程安全,要在getIntance方法前加上synchronized修饰,实现线程同步
//因为加上了synchronized同步,所以执行效率低
public static synchronized SingletonDemo getIntance(){
if(intance==null){
intance = new SingletonDemo();
}
return intance;
}
}

静态内部类模式为:

package com.静态内部类式模式;
/*
 * 特点:外部类没有static属性,不会像饿汉式模式一样类加载时就初始化对象
 * 只有真正调用getIntance方法时才会加载静态内部类
 * 加载类是线程安全的
 * ntance是 static final的,保证了内存中只有这样一个实例,而且只能被赋值一次。
 * 所以是线程安全的
 * 兼并了并发高效调用和延迟加载的优势
 */
public class SingletonDemo {
    //在初始化SingletonDemo类的时候并不会初始化他的静态内部类
private static class SingletonInance{
private static final SingletonDemo intance = new SingletonDemo();
}
public static SingletonDemo getIntance(){
//只有调用该方法时才会加载静态内部类
return SingletonInance.intance;
}
private SingletonDemo(){

}
}

0 0
原创粉丝点击