《Java高并发程序设计》学习 --5.1 探讨单例模式
2017-03-20 18:57
405 查看
它是一种对象创建模式,用于产生一个对象的具体实例,确保系统中一个类只有一个实例。这样带来的好处主要有两点:
1. 对于频繁使用的对象,可以省略new操作花费的时间,这样对于那些重量级对象而言,可以节省非常可观的一笔系统开销。
2. 由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC压力,缩短GC停顿时间。
下面给出了一个单例的实现,这个实习生非常简单的,但无疑是一个正确并且良好的实现。
将上述两种方法优势结合的方法:
上述代码实现了一个单例,并且同时拥有前两种方式的优点。首先getInstance()方法中没有锁,这使得在高并发环境下性能优越。其次,只有在getInstance()方法被第一次调用时,StaticSingleton的实例才会被创建。因为这种方法巧妙地使用了内部类和类的初始化方式。内部类SingletonHolder被申明为private,这使得我们不可能在外部访问并且初始化它。而我们只可能在getInstance()内部对SingletonHolder类进行初始化,利用虚拟机的类初始化机制创建单例。
注:本篇博客内容摘自《Java高并发程序设计》
1. 对于频繁使用的对象,可以省略new操作花费的时间,这样对于那些重量级对象而言,可以节省非常可观的一笔系统开销。
2. 由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC压力,缩短GC停顿时间。
下面给出了一个单例的实现,这个实习生非常简单的,但无疑是一个正确并且良好的实现。
public class Singleton { private Singleton() { System.out.println("Singleton is create"); } private static Singleton instance = new Singleton(); public static Singleton getInstance() { return instance; } }若想精确控制instance的创建时间,具体实现如下:
public class LazySingleton { private LazySingleton() { System.out.println("LazySingleton is create"); } private static LazySingleton instance = null; public static synchronized LazySingleton getInstance() { if(instance == null) instance = new LazySingleton(); return instance; } }
将上述两种方法优势结合的方法:
public class StaticSingleton { private StaticSingleton () { System.out.println("StaticSingleton is create"); } private static class SingletonHolder { private static StaticSingleton instance = new StaticSingleton(); } public static StaticSingleton getInstance() { return SingletonHolder.instance; } }
上述代码实现了一个单例,并且同时拥有前两种方式的优点。首先getInstance()方法中没有锁,这使得在高并发环境下性能优越。其次,只有在getInstance()方法被第一次调用时,StaticSingleton的实例才会被创建。因为这种方法巧妙地使用了内部类和类的初始化方式。内部类SingletonHolder被申明为private,这使得我们不可能在外部访问并且初始化它。而我们只可能在getInstance()内部对SingletonHolder类进行初始化,利用虚拟机的类初始化机制创建单例。
注:本篇博客内容摘自《Java高并发程序设计》
相关文章推荐
- 《Java高并发程序设计》学习 --5.8 并行排序
- java高并发程序设计学习笔记二多线程基础
- 《Java高并发程序设计》学习 --6.5 增强的Future:CompletableFuture
- java高并发程序设计学习笔记三内存模型线程安全
- java高并发程序设计学习笔记八BIO、NIO和AIO
- JAVA高并发程序设计学习:Synchronized同步代码块具体使用方法
- java高并发程序设计学习笔记九锁的优化和注意事项
- java高并发程序设计学习笔记四无锁
- Java高并发程序设计——学习摘要-第二章
- Java 高并发程序设计学习笔记--wait 和notify
- java高并发程序设计学习笔记五六JDK并发包
- java高并发程序设计学习笔记一前言
- 《Java高并发程序设计》学习 --3.3 JDK的并发容器
- Java高并发程序设计——学习摘要-第一章
- JAVA并发编程学习笔记之AQS简介
- 如何学习Java程序设计?
- JAVA并发编程学习笔记之MCS队列锁
- java并发学习
- 【新手】【转】如何学习java程序设计
- Java学习总结4---java.lang.ref包探讨