900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > java singleton 数据清楚_成都汇智动力-java singleton

java singleton 数据清楚_成都汇智动力-java singleton

时间:2018-07-06 11:58:13

相关推荐

java singleton 数据清楚_成都汇智动力-java singleton

原标题:成都汇智动力-java singleton

1.什么是单例模式?单例模式的应用场景?

名称:单例模式

英文名:Singleton

定义:java中单例模式是一种常见的设计模式,单例就是“一个对象,只实例化一次。”

分类:主要分为:“懒汉式”单例模式 ||“饿汉式”单例模式

具体分类定义:

(1)懒汉式:

//懒汉式单例类,在本类第一次调用的时候实例化自己

publicclassLazyManSingleton {

//私有化构造方法

private LazyManSingleton(){}

//定义空单例对象,不调用,则不实例

privatestaticLazyManSingleton single=null;

//静态工厂方法

publicstaticLazyManSingleton getInstance()

{

if(single==null)

{ //当被调用时,实例化懒汉对象

single=new LazyManSingleton();}

returnsingle;

}

}

(2)饿汉式:

//饿汉式单例类,在类初始化时,自行实例化

publicclassHungryManSingleton {

//私有化构造方法

private HungryManSingleton (){}

//私有 “实例化后的” 化饿汉单例对象

privatestaticfinal HungryManSingleton single=new HungryManSingleton();

//静态工厂方法

publicstatic HungryManSingletongetInstance()

{

//被调用时直接返回已经准备好的对象

returnsingle;

}

}

代码理解:

首先看看代码:无论是lazy还是hungry,他们的单例类都是相同步骤:

第一步:(垄断)------私有化构造器,这步有何作用呢?总所周知,私有化的东西(变量,方法,构造器)只能被本类(A类)使用,其他类不能直接调用,就算是父子类也不行。所以私有化构造器,就确保了其他类不能随意调用A类的构造方法,创建A类的实例对象了,这样的话,想创建几个A类对象就要看A类自己的心情了。A类想创建几个就创建几个。其他类因为调用不了A类的构造器,所以永远都不能创建出一个A类对象。当然,天无绝人之路,虽然其他类不能自己生产A类对象了,但是A类可以生产完“卖给”其他类呀,这就要看第二步,第三步了。

第二三步:(生产【盒子】【货】,发货)-------A类生产,并传递A类对象的环节。这里也就是“懒汉”和“饿汉”的区别所在了,假设懒汉是A1类,这个A1很懒,做事拖沓,每次都不提前准备一些货(A1对象),以至于他的对象盒子是空的,只有在别的类来催的时候,才急急忙忙的在静态工厂里生产,生产完直接装箱送货。所以A1的静态工厂,是既负责生产,又负责发货,苦啊,一条龙全包了

。 而“饿汉”A2类,那就不一样,典型的高效外卖馆啊,别人订货的瞬间就把盒饭打包好,然后瞬间传递到静态工厂,A2的静态工厂就只是一个送饭的作用了,不负责做饭。

单例模式的特点:(1)单例类只能有一个实例

(2)单例类必须自己创建自己的唯一实例

(3)单例类必须给所有其他对象提供这一个实例

特点详解:(1)单例模式为啥只有一个实例,为什么不多创建几个实例?

答:单例模式,单例模式,顾名思义,只有一个实例,多好,多么的节约内存,还不容易产生混淆。就一个实例还不好辨认吗?对象很安全。许多时候,整个系统只需要拥有一个全局对象,这样的好处是,我们更容易协调系统整体的行为,这和秦始皇统一度量衡一个道理。专业点的解释一下就是,比如某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取(咋读取啊?),然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了复杂环境下的配置管理。叼!

(2)单例对象必须自己创建自己唯一的对象。

答:读起来是不是很拗口?其实意思很简单,自己的对象自己建,别人办事,我不放心,自己动手,最合心意。单例类,他是干嘛的?为了啥,才被我们创建出来的?他的目的就是执行统一大业的,统一度量衡,统一文字,统一车轨的,所以他就是标准,他只能是唯一。如果楚国说:“秦国,你的度量衡要按咱楚国的推广”,齐国说:“秦国,你的文字要按俺的来”,燕国说:“那车轨就按俺们那嘎达燕淫的”。你是秦国,你咋办?秦国:“一群羊杂碎,统统按额们秦国滴标准来。”所以标准还得自己来造,交给别人一人一个样。

(3)单例类必须给所有其他对象提供这一个实例

答:综合上面那两个特点,最后一个就不用详解了。你秦国统一文字,度量,车轨,法律干嘛呢,玩儿呢?肯定是推广出去啊,让别人也体验一下商鞅变法的封建主义的优越性啊。

单例模式的应用场景:

1.windows的任务管理器(ctrl+shift+esc),就是一个典型的单例模式,你试着打开两个看看?逗你呢,他是单例模式,开不了两个。

为什么不能打开两个?(1)如果能弹出多个窗口,且这些窗口的内容完全一致,全部是重复对象,这势必会浪费系统资源,任务管理器需要获取系统运行时的诸多信息,这些信息的获取需要消耗一定的系统资源,包括cpu资源以及内存资源,弹出多个内容相同,操作相同的窗口,除了浪费宝贵资源外,没有任何好处。(2)如果弹出的多个窗口,内容不一致,那不是你电脑中毒了,就是中毒了。

2.windows的回收站,在整个系统运行过程中,回收站一直维护着仅有的一个实例。

3.网站的计数器,一般也是采用单例模式实现,否则难以同步。

4.应用程序的日志应用,一般都用单例模式实现,这一般是由于共享日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。

5.Web应用的配置对象的读取,一般也应用单例模式,这是由于配置文件是共享的资源。

6.数据库连接池的设计一般也是采用单例模式,因为数据库连接是一种数据库资源。数据库软件系统中使用数据库连接池,主要是节省打开或者关闭数据库所引起的效率损耗,这种效率上的损耗还是非常昂贵的,因为采用单例模式来维护,就可以大大降低这种损耗。

7.多线程的连接池的设计一般也是采用单里迷失,知识由于线程要方便对池中的线程进行控制。

8.操作系统的文件系统,也是大的单例模式实现的具体例子,一个操作系统只能有一个文件系统。

9.HttpApplication也是单例的典型应用

总结,单例模式的应用场景一般发现在以下条件:

(1)资源共享的情况下,避免由于资源操作时导致的性能损耗,如上述的日志文件,应用配置

(2)控制资源的情况下,方便资源之间的互相通讯,如线程池

懒汉模式与饿汉模式的优缺点比较:

http://m./article/details?id=26138355

1.时间和空间

懒汉式是典型的时间换空间,每次获取实例,都会进行判断,如果已经有了实例,就不实例化,如果没有,则进行实例化。当一直没人获取懒汉实例,那么久节约了内存空间。

饿汉式是典型的空间换时间,当类被加载时就会创建实例,不管你用不用,先创建出来,当你需要获取实例时,就不需要判断实例是否存在,直接给了就是。这就节约了时间。

2.线程安全

(1)从线程安全性上讲,不加同步的懒汉式是线程不安全的,比如,有两个线程,一个是线程A,一个是线程B,他们同时调用getInstance()方法,那就可能造成并发问题,实例化出两个实例,这就背离单例模式,懒汉式单例模式也会因此失效。

(2)饿汉式是线程安全,因为虚拟机只会装载一次,在装载类的时候是不会发生并发的。

(3)如何实现懒汉式单例线程安全?

简单的实现方法:public static synchronized Singleton getInstance(){}

这种方法的缺点是降低了整个访问速度,而且每次都要判断。

双重检查加锁:

解释:并不是每次进入getInstance方法都需要同步,这里可以先不同步,进入方法过后,先检查实例是否存在,如果不存在才进入下面的同步块,这是第一重检查。进入同步块后,再次检查实例是否存在,如果不存在,就在同步的情况下创建一个实例,这是第二重检查。这样一来,就只需要同步一次了,从而减少了多次在同步情况下进行判断所浪费的时间。

双重检查加锁机制的实现会使用一个关键字volatile,它的意思是:被volatile修饰的变量的值,将不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而确保多个线程能正确的处理该变量。

看看代码可能会更加清楚些。示例代码如下:

publicclassSingleton{

privatevolatilestaticSingletoninstance=null;

privateSingleton(){

}

publicstaticSingletongetInstance(){

//先检查实例是否存在,如果不存在才进入下面的同步块

if(instance==null){

//同步块,线程安全地创建实例

synchronized(Singleton.class){

//再次检查实例是否存在,如果不存在才真正地创建实例

if(instance==null){

instance=newSingleton();

}

}

}

returninstance;

}

责任编辑:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。