单例模式笔记
前言
单例模式是指:确保一个类在任何情况下都绝对只有一个实例,隐藏其构造的方法,并提供一个全局访问点
例如ServletContext、ServletConfig、ApplicationContext、DBPool
你能记起多少单例?
饿汉式,饱汉式,双重检查式,静态内部类式
饿汉式
缺点:当需要加载的单例对象数量过多时,会造成内存浪费
==注:==如果是变成static代码块去new也是没有本质区别的——因为都是一开始就初始化了,不过至少可以放上对应的初始化的操作,还是比原生的要好一点点的
1 2 3 4 5 6 7 8 9 10 11 12 13
|
public class DanLiDemo01 { private static DanLiDemo01 instance=new DanLiDemo01(); private DanLiDemo01() {} public static DanLiDemo01 getInstance() { return instance; } }
|
饱汉式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
public class DanLiDemo02 { private static DanLiDemo02 instance=null; private DanLiDemo02() {} public synchronized static DanLiDemo02 getInstance(){ if(instance==null){ instance=new DanLiDemo02(); } return instance; } }
|
双重检查式
参考链接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
|
public class DanLiDemo04 {
private static DanLiDemo04 instance; public static DanLiDemo04 getInstance(){ if(instance ==null) { synchronized (DanLiDemo04.class) { if (instance == null) { instance = new DanLiDemo04(); } } } return instance; }
private static void doSomething(){
}
public static void main(String[] args) { boolean stop = false; while(!stop){ doSomething(); } stop = true; }
private volatile static DanLiDemo04 instance2; private DanLiDemo04() {} public static DanLiDemo04 getInstance2(){ if(instance ==null) { synchronized (DanLiDemo04.class) { if (instance == null) { instance = new DanLiDemo04(); } } } return instance; } }
|
静态内部类式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
public class DanLiDemo03 { private static class Instance{ public static final DanLiDemo03 instance=new DanLiDemo03(); } private DanLiDemo03() {} public static DanLiDemo03 getInstance(){ return Instance.instance; } }
|
本个人博客提供的内容仅用于个人学习,不保证内容的正确性。通过使用本站内容随之而来的风险与本站无关!