本帖最后由 fxwb2005 于 2014-8-5 11:33 编辑
之前也看论坛里有童鞋提出这两者的特点和区别,而且懒汉式在面试中也经常会考到,看完视频总结了一下,希望对不知道的童鞋有所帮助。
首先是饿汉式:
- class Single
- {
- private static final Single s=new Single();
- private Single(){}
- public static Single getInstance()
- {
- return s;
- }
- }
复制代码
创建静态对象时final加不加无所谓,但老毕说加上更严谨那就加上吧,饿汉式是比较常用的单例模式。
接下来是懒汉式:
- class Single {
- private ststic Single s=null;
- private Single(){}
- public ststic Single getInstance()
- {
- if(s==null){
- synchronized(Single.class){
- if(s==null)
- {
- s=new Single();
- return s;
- }
- }
- }
- }
- }
复制代码
懒汉式的特点是使用了延迟加载,饿汉式在类创建时就创建好了对象,但懒汉式只是声明了对象,在调用的时候才会创建对象实例,这样可以节省一些资源,但是懒汉式在多线程访问时会发生安全问题,有可能会创建出多个对象,这样就违背了单例模式的初衷,所以需要使用同步方法或者同步代码块来解决这个问题,但如果使用同步方法的话,每个线程进来都要判断一次锁,会对效率有一些影响,所以可以使用双重if判断和同步代码块来提高效率。
提示:懒汉模式在声明对象时不可以加final,否则下面无法创建对象实例,因为单例模式使用的是静态方法,所以同步使用的锁不是this,而是该类所属的字节码文件对象。也就是:类名.class。 |
|