java语言之单例设计模式
来源:互联网 发布:易语言七夕表白源码 编辑:程序博客网 时间:2024/06/05 17:20
1. 非多线程下的单例设计模式
设计模式:对问题行之有效的解决方式,其实,它是一种思想。
单例设计模式解决的问题:就是可以保证一个类在内存中的对象唯一性。
比如多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。
单例设计模式解决的问题:就是可以保证一个类在内存中的对象唯一性。
比如多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。
如何保证对象唯一性呢?
1、不允许其他程序用new创建该类对象。
2、在该类创建一个本类实例。
3、对外提供一个方法让其他程序可以获取该对象。
步骤:
1、私有化该类构造函数。
2、通过new在本类中创建一个本类对象。
3、定义一个公有的方法,将创建的对象返回。
示例(饿汉式):
class Single{ //类已加载,对象就已经存在了 private static Single s = new Single(); private Single(){} public static Single getInstance(){ return s ; }}class SingleDemo{ public static void main(String[] args){ Single s1 = Single.getInstance(); Single s2 = Single. getInstance(); System.out.println(s1 == s2); }}
运行结果:
P.S.
之所以不用Single.s;的方式获取Single对象,而采用getInstance获取是因为在getInstance方法中我们可以做一些判断来决定是否返回Single的对象,也就是实现了对单例对象的可控。所以,给Single的构造方法加上了private限制,禁止使用者直接采用Single.s;的方式获取。
之所以不用Single.s;的方式获取Single对象,而采用getInstance获取是因为在getInstance方法中我们可以做一些判断来决定是否返回Single的对象,也就是实现了对单例对象的可控。所以,给Single的构造方法加上了private限制,禁止使用者直接采用Single.s;的方式获取。
示例(懒汉式):
class Single{ //类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象 //延迟加载形式 private static Single s = null; private Single(){} public static Single getInstance(){ if(s == null) s = new Single(); return s ; }}class SingleDemo{ public static void main(String[] args){ Single s1 = Single. getInstance(); Single s2 = Single. getInstance(); System.out.println(s1 == s2); }}
运行结果:
2.多线程下的单例模式
class Single{ private static final Single s = new Single(); private Single(){} public static Single getInstance(){ return s ; }}
P.S.
饿汉式不存在安全问题,因为不存在多个线程共同操作数据的情况。 懒汉式:
class Single{ private static Single s = null; private Single(){} public static Single getInstance(){ if(s ==null){ synchronized(Single.class){ if(s == null) s = new Single(); } } return s ; }}
P.S.
懒汉式存在安全问题,可以使用同步函数解决。
但若直接使用同步函数,则效率较低,因为每次都需要判断。
但若采取如下方式,即可提升效率。
原因在于任何一个线程在执行到第一个if判断语句时,如果Single对象已经创建,则直接获取即可,而不用判断是否能够获取锁,相对于上面使用同步函数的方法就提升了效率。如果当前线程发现Single对象尚未创建,则再判断是否能够获取锁。
1. 如果能够获取锁,那么就通过第二个if判断语句判断是否需要创建Single对象。因为可能当此线程获取到锁之前,已经有一个线程创建完Single对象,并且放弃了锁。此时它便没有必要再去创建,可以直接跳出同步代码块,放弃锁,获取Single对象即可。如果有必要,则再创建。
2. 如果不能获取到锁,则等待,直至能够获取到锁为止,再按步骤一执行。
0 0
- java语言之单例设计模式
- 设计模式之单例模式(java语言)
- 设计模式之单例模式java语言的实现
- java设计模式之单例设计
- java设计模式之单例模式
- Java模式设计之单例模式
- Java模式设计之单例模式
- Java模式设计之单例模式
- java设计模式之单例模式
- Java模式设计之单例模式
- Java模式设计之单例模式
- Java设计模式之单例模式
- Java设计模式之单例模式
- Java设计模式之单例模式
- Java设计模式之单例模式
- Java模式设计之单例模式
- java设计模式之单例模式
- java设计模式之单例模式
- 指针变量的三种表现形式
- iOS开发之对UUID 和 UDID的理解
- Unity3D高通ar-----增强现实
- boost库之aiso通信
- poj 2503 Babelfish Trie
- java语言之单例设计模式
- uva 165 Stamps (回溯)
- hdu1016 Prime Ring Problem(DFS)
- 数组、结构体、指针1
- Android LayoutInflater 详解
- Ordering Tasks
- Linux内核分析MOOC课程汇编分析
- 有getter setter的属性在Inspector视图中设置值
- session与cookie的区别和联系?