JAVA设计模式--单例模式

来源:互联网 发布:期货公司 知乎 编辑:程序博客网 时间:2024/05/21 22:41

引言

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。在计算机系统中,线程池、缓存、日志对象等对象常被设置为单例模式。单例模式常被分为三种,饿汉式、懒汉式和登记式,而登记式很少用到再次。

懒汉式

最基本的懒汉式

 * 最基本的懒汉式单例模式 * @author WHF */public class Singleton {private static Singleton single=null;private Singleton(){}//静态工厂方法public static Singleton getInstance(){if(single==null){single=new Singleton();}return single;}}

线程安全的懒汉式

如果要在多线程环境中对懒汉式单例模式初始化,那么我们必须小心的放置多个线程同时初始化该单例。在多线程环境中,我们无法保证一个方法能够持续运行到结束,其他线程的方法才开始运行。因而可能存在这样一种情形:两个线程几乎同时尝试初始化单例类。接下来,这两个方法都会对该单例进行初始化。为了防止这种类型的竞争,需要提供一个锁机制来协调不同的线程中多个方法的运行。

/** * 线程安全的懒汉式单例模式 * @author WHF */public class Singleton {private static Singleton single=null;private Singleton(){}//静态工厂方法public Singleton getInstance(){synchronized(Singleton.class){if(single==null){single=new Singleton();}}return single;}}
上面的代码的确解决了线程安全的问题,但是却带来了一个新的问题:效率低下。因为真正需要new对象的情况是非常少的,然而每次都要在synchronized处排队等候,这就使得效率低下,浪费资源。

线程安全又效率的懒汉式

/** * 线程安全而又效率的懒汉式单例模式 * @author WHF */public class Singleton {private static Singleton single=null;private Singleton(){}//静态工厂方法public Singleton getInstance(){if(single==null){synchronized(Singleton.class){if(single==null){single=new Singleton();}}}return single;}}
这种写法被称为双重检查锁,这样就可以减少绝大多数的加锁操作,使得效率有所提高。

饿汉式

/** * 饿汉式单例模式 * @author WHF */public class Singleton{private Singleton(){}private static final Singleton singleton=new Singleton();//静态工厂方法public static Singleton getInstance(){return singleton;}}
优缺点比较
1.饿汉式代码简单,并且是线程安全的。
2.懒汉式代码复杂,线程不安全,但是可以实现单例的延迟创建。




1 0
原创粉丝点击