单例模式的实现方式
2016-05-05 11:05
393 查看
单例模式的实现方式
1、只适用于单线程的环境
将构造函数私有化以禁止他人创建实例,定义一个静态私有的实例,当需要实例的时候,从中获取或创建(懒汉模式),是线程不安全的public class Singleton1 {
private Singleton1(){};
private static Singleton1 instance=null;
public static Singleton1 getInstance(){
if(instance==null){
instance=new Singleton1();
}
return instance;
}
}
2、能在多线程下工作但效率很低
在第一种情况中,如果两个线程同时判断instance是否为null,并且instance没有被创建,那么两个线程都会创建一个实例,就不再满足单例模式了。public class Singleton2 {
private Singleton2(){};
private static Singleton2 instance=null;
public static synchronized Singleton2 getInstance(){
if(instance==null){
instance=new Singleton2();
}
return instance;
}
}
3、饿汉模式
当类进行加载的时候,就实现实例化,可以避免多线程,其会过早创建一个实例,从而降低了内存的使用效率。public class Singleton3 { private Singleton3(){}; private static Singleton3 instance=new Singleton3(); public static Singleton3 getInstance(){ return instance; } }
也可以将实例化放在静态代码块中实现
public class Singleton4 { private Singleton4(){}; private static Singleton4 instance=null; static{ instance=new Singleton4(); } public static Singleton4 getInstance(){ return instance; } }
4、双重检查锁定
public class Singleton5 { private Singleton5(){}; private volatile static Singleton5 instance=null; public static Singleton5 getInstance(){ if(instance==null){ synchronized(Singleton5.class){ if(instance==null){ instance=new Singleton5(); } } } return instance; } }
5、使用静态内部类
public class Singleton6 { private Singleton6(){}; private static final Singleton6 getInstance(){ return Singleton6Holder.INSTANCE; } private static class Singleton6Holder{ private static final Singleton6 INSTANCE=new Singleton6(); } }
定义了一个私有类型的内部类,当Singleton6被加载的时候,并不会直接实例化,只有当调用getInstance的方法时,才会实例化,实现了懒加载。
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序