达内潍坊中心 > 达内新闻
Java开发中的23种设计模式详解(五)
- 发布:潍坊达内
- 来源:潍坊达内
- 时间:2018-11-30 18:57
性能优化-潍坊达内负责整理
上面的代码虽然简单,但是有一个问题--无论这个类是否被使用,都会创建一个instance对象。如果这个创建过程很耗时,比如需要连接10000次数据库(夸张了…:-)),并且这个类还并不一定会被使用,那么这个创建过程就是无用的。怎么办呢?
为了解决这个问题,我们想到了新的解决方案:
代码的变化有两处--首先,把instance初始化为null,直到第一次使用的时候通过判断是否为null来创建对象。因为创建过程不在声明处,所以那个final的修饰必须去掉。
我们来想象一下这个过程。要使用SingletonClass,调用getInstance()方法。第一次的时候发现instance是null,然后就新建一个对象,返回出去;第二次再使用的时候,因为这个instance是static的,所以已经不是null了,因此不会再创建对象,直接将其返回。
这个过程就成为lazy loaded,也就是迟加载--直到使用的时候才进行加载。
一直人会问,说代数差的可以学JS吗?
置信极多人真有这一类的惊讶,解惑这种置疑平常,对于我们准备鉴定一份数学题:两地相距500米。贲潇从A地以1米每秒的速度向B地走,褚沛文从B地以每秒1米的速度向a走。请问:他们多久后相遇?
相遇的地点离B地有多远?这那就是一道易懂上学数学题,潍坊达内培训告诉我们,然而对于代数不好的人,或许要要想好多时间。然而其实要我JS不用你把计算结果写出来,你肯定要小心他的思考思维就行。其实,要用JS来清理之上的置疑,你只肯定要当心个相比而言易懂的代数原型︰即加、减、乘、除和求余就行,其实要我和会背公式有点像。
极多人没进修JS的人,都认为代数不好,无法成为程序员。其实要我代数跟JS的大不了可以整理为:精代数者,不一定会JS,不略懂代数,也能进修JS,如欲精JS,必精代数,若已略懂代数者,学JS不难也。
因此,代数不好应是可以学JS,然而会比代数好的人难,要有很大的恒心,日常那就是要多去升高自身的思考和整理才气。
同步

上面的代码很清楚,也很简单。然而就像那句名言:“80%的错误都是由20%代码优化引起的”.单线程下,这段代码没有什么问题,可是如果是多线程,麻烦就来了。我们来分析一下:
线程A希望使用SingletonClass,调用getInstance()方法。因为是第一次调用,A就发现instance是null的,于是它开始创建实例,就在这个时候,CPU发生时间片切换,线程B开始执行,它要使用SingletonClass,调用getInstance()方法,同样检测到instance是null--注意,这是在A检测完之后切换的,也就是说A并没有来得及创建对象--因此B开始创建。B创建完成后,切换到A继续执行,因为它已经检测完了,所以A不会再检测一遍,它会直接创建对象。这样,线程A和B各自拥有一个SingletonClass的对象--单例失败!
解决的方法也很简单,那就是加锁:
是要getInstance()加上同步锁,一个线程必须等待另外一个线程创建完成后才能使用这个方法,这就保证了单例的唯一性。
又是性能
上面的代码又是很清楚很简单的,然而,简单的东西往往不够理想。这段代码毫无疑问存在性能的问题--synchronized修饰的同步块可是要比一般的代码段慢上几倍的!如果存在很多次getInstance()的调用,那性能问题就不得不考虑了!
以上就是潍坊达内给大家做的内容详解,更多关于UI的学习,请继续关注潍坊达内
最新开班时间
- 北京
- 上海
- 广州
- 深圳
- 南京
- 成都
- 武汉
- 西安
- 青岛
- 天津
- 杭州
- 重庆
- 哈尔滨
- 济南
- 沈阳
- 合肥
- 郑州
- 长春
- 苏州
- 长沙
- 昆明
- 太原
- 无锡
- 石家庄
- 南宁
- 佛山
- 珠海
- 宁波
- 保定
- 呼和浩特
- 洛阳
- 烟台
- 运城
- 潍坊
Java开发中的23种设计模式详解(五)
- 发布:潍坊达内
- 来源:潍坊达内
- 时间:2018-11-30 18:57
性能优化-潍坊达内负责整理
上面的代码虽然简单,但是有一个问题--无论这个类是否被使用,都会创建一个instance对象。如果这个创建过程很耗时,比如需要连接10000次数据库(夸张了…:-)),并且这个类还并不一定会被使用,那么这个创建过程就是无用的。怎么办呢?
为了解决这个问题,我们想到了新的解决方案:
代码的变化有两处--首先,把instance初始化为null,直到第一次使用的时候通过判断是否为null来创建对象。因为创建过程不在声明处,所以那个final的修饰必须去掉。
我们来想象一下这个过程。要使用SingletonClass,调用getInstance()方法。第一次的时候发现instance是null,然后就新建一个对象,返回出去;第二次再使用的时候,因为这个instance是static的,所以已经不是null了,因此不会再创建对象,直接将其返回。
这个过程就成为lazy loaded,也就是迟加载--直到使用的时候才进行加载。
一直人会问,说代数差的可以学JS吗?
置信极多人真有这一类的惊讶,解惑这种置疑平常,对于我们准备鉴定一份数学题:两地相距500米。贲潇从A地以1米每秒的速度向B地走,褚沛文从B地以每秒1米的速度向a走。请问:他们多久后相遇?
相遇的地点离B地有多远?这那就是一道易懂上学数学题,潍坊达内培训告诉我们,然而对于代数不好的人,或许要要想好多时间。然而其实要我JS不用你把计算结果写出来,你肯定要小心他的思考思维就行。其实,要用JS来清理之上的置疑,你只肯定要当心个相比而言易懂的代数原型︰即加、减、乘、除和求余就行,其实要我和会背公式有点像。
极多人没进修JS的人,都认为代数不好,无法成为程序员。其实要我代数跟JS的大不了可以整理为:精代数者,不一定会JS,不略懂代数,也能进修JS,如欲精JS,必精代数,若已略懂代数者,学JS不难也。
因此,代数不好应是可以学JS,然而会比代数好的人难,要有很大的恒心,日常那就是要多去升高自身的思考和整理才气。
同步

上面的代码很清楚,也很简单。然而就像那句名言:“80%的错误都是由20%代码优化引起的”.单线程下,这段代码没有什么问题,可是如果是多线程,麻烦就来了。我们来分析一下:
线程A希望使用SingletonClass,调用getInstance()方法。因为是第一次调用,A就发现instance是null的,于是它开始创建实例,就在这个时候,CPU发生时间片切换,线程B开始执行,它要使用SingletonClass,调用getInstance()方法,同样检测到instance是null--注意,这是在A检测完之后切换的,也就是说A并没有来得及创建对象--因此B开始创建。B创建完成后,切换到A继续执行,因为它已经检测完了,所以A不会再检测一遍,它会直接创建对象。这样,线程A和B各自拥有一个SingletonClass的对象--单例失败!
解决的方法也很简单,那就是加锁:
是要getInstance()加上同步锁,一个线程必须等待另外一个线程创建完成后才能使用这个方法,这就保证了单例的唯一性。
又是性能
上面的代码又是很清楚很简单的,然而,简单的东西往往不够理想。这段代码毫无疑问存在性能的问题--synchronized修饰的同步块可是要比一般的代码段慢上几倍的!如果存在很多次getInstance()的调用,那性能问题就不得不考虑了!
以上就是潍坊达内给大家做的内容详解,更多关于UI的学习,请继续关注潍坊达内
最新开班时间
- 北京
- 上海
- 广州
- 深圳
- 南京
- 成都
- 武汉
- 西安
- 青岛
- 天津
- 杭州
- 重庆
- 厦门
- 哈尔滨
- 济南
- 福州
- 沈阳
- 合肥
- 郑州
- 长春
- 苏州
- 大连
- 长沙
- 昆明
- 温州
- 太原
- 南昌
- 无锡
- 石家庄
- 南宁
- 中山
- 兰州
- 佛山
- 珠海
- 宁波
- 贵阳
- 保定
- 呼和浩特
- 东莞
- 洛阳
- 潍坊
- 烟台
- 运城