码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式的5种形式

时间:2017-11-09 21:03:25      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:www   建议   public   关键字   blog   线程   title   hold   main   

有过编程经验的朋友都知道设计模式中的单例模式,最近又重新看了一遍设计模式,今天将单例模式的几种形式介绍一下:

1、懒汉形式(延迟加载)

Singleton.java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Singleton{
    private static Singleton singleton;

    private Singleton() {
    }

    public synchronized static Single newInstance() {
        if (singleton== null) {
            singleton= new Singleton();
        }
        return singleton;
    }
}

这个是标准的单例模式,通过newInstance里面的判断来进行延迟加载单例对象,这里加了synchronized关键字可以避免多线程问题,但会影响程序性能。

2、饿汉形式(贪婪加载)

Singleton.java
1
2
3
4
5
6
7
8
9
10
public class Singleton {
    private static Singleton singleton= new Singleton();

    private singleton() {
    }

    public static Singleton newInstance() {
        return singleton;
    }
}

在单例对象声明的时候就直接初始化对象,可以避免多线程问题,但是如果对象初始化比较复杂,会导致程序初始化缓慢。

3、双重检查加锁

Singleton.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Singleton {
    private volatile static Singleton singleton;

    private Singleton() {
    }

    public static Singleton newInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

这个是懒汉形式的加强版,将synchronized关键字移到了newInstance方法里面,同时将singleton对象加上volatile关键字,这种方式既可以避免多线程问题,又不会降低程序的性能。但volatile关键字也有一些性能问题,不建议大量使用。

4、Lazy initialization holder class

Singleton.java
1
2
3
4
5
6
7
8
9
10
11
12
public class Singleton {
    private static class SingletonHolder {
        private static Singleton singleton = new Singleton();
    }

    private Singleton() {
    }

    public static Singleton newInstance() {
        return SingletonHolder.singleton;
    }
}

这里创建了一个内部静态类,通过内部类的机制使得单例对象可以延迟加载,同时内部类相当于是外部类的静态部分,所以可以通过jvm来保证其线程安全。这种形式比较推荐。

5、枚举

Singleton.java
1
2
3
public enum Singleton {
    singleton
}

单因素的枚举类已经实现了单例,这种方法更加简单。

单例模式的5种形式

标签:www   建议   public   关键字   blog   线程   title   hold   main   

原文地址:http://www.cnblogs.com/yang82/p/7811064.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!