设计模式之单例模式
Posted 李秀玉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式之单例模式相关的知识,希望对你有一定的参考价值。
单例对象(Singleton)是一种常用的设计模式。在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在。这样的模式有几个好处:
1、某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销。
2、省去了new操作符,降低了系统内存的使用频率,减轻GC压力。
单例模式的实现一般分类饿汉式和懒汉式两种。下面分别介绍:
一.懒汉式
懒汉式是说类在初始化的时候并不创建类的实例,而是在第一次加载的时候才创建。
1 //懒汉式单例类.在第一次调用的时候实例化自己 2 public class Singleton { 3 //私有化构造方法 4 private Singleton() {} 5 private static Singleton single=null; 6 //静态工厂方法 7 public static Singleton getInstance() { 8 if (single == null) { 9 single = new Singleton(); 10 } 11 return single; 12 } 13 }
这个类可以满足基本要求,但是,像这样毫无线程安全保护的类,如果我们把它放入多线程的环境下,肯定就会出现问题了,如何解决?
为了保证多线程环境下的线程安全,我们一般有如下几种方式:
1.在getInstance()方法上加同步
1 public static synchronized Singleton getInstance() { 2 if (single == null) { 3 single = new Singleton(); 4 } 5 return single; 6 }
这样是可以保证线程安全的,但是,synchronized关键字锁住的是这个对象,这样的用法,在性能上会有所下降,因为每次调用getInstance(),都要对对象上锁,事实上,只有在第一次创建对象的时候需要加锁,之后就不需要了,所以,这个地方需要改进。
2.双重检查锁定
public static Singleton getInstance() { if (single == null) { synchronized (single) { if (single == null) { single = new Singleton(); } } } return single; }
3.静态内部类
1 public class Singleton { 2 private static class LazyHolder { 3 private static final Singleton INSTANCE = new Singleton(); 4 } 5 private Singleton (){} 6 public static final Singleton getInstance() { 7 return LazyHolder.INSTANCE; 8 } 9 }
这种方式比前2种方式都好,既保证了线程安全,有提升了系统的性能。
二.饿汉式
1 //饿汉式单例类.在类初始化时,已经自行实例化 2 public class Singleton { 3 private Singleton() {} 4 private static final Singleton single = new Singleton(); 5 //静态工厂方法 6 public static Singleton getInstance() { 7 return single; 8 } 9 }
饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生是线程安全的。
以上是关于设计模式之单例模式的主要内容,如果未能解决你的问题,请参考以下文章