标签:test div 使用 定义 带来 bsp log 高性能 模式
第一次写东西,文体形式槽点多多,欢迎指正。
本文旨在交流学习,欢迎大神拍砖。
单例模式是设计模式中比较简单的一个,学习起来比较容易理解。下面开始聊聊各种场景下的单例模式。
单例模式的定义: 一个类有且仅有一个实例,并且自行实例化向整个系统提供。
单例模式的要素: 1.私有的静态的实例对象 2.私有的构造函数(保证在该类外部,无法通过new的方式来创建对象实例) 3.公有的、静态的、访问该实例对象的方法
单例模式分为懒汉形和饿汉式 懒汉式
一、懒汉式单例模式:
优点是:类Singleton被加载时并未被分配空间,当调用getInstance()方法时才分配空间,节省内存。
缺点是:并发环境下很可能出现多个Singleton实例。
1 /** 2 * 懒汉模式 3 * 在第一次调用实例方法的时候才会实例化对象 4 * */ 5 public class Singleton { 6 7 private static Singleton instance = null; 8 private Singleton(){} 9 public static Singleton getInstance(){ 10 if(instance==null){ 11 instance = new Singleton(); 12 } 13 return instance; 14 } 15 16 17 }
二、饿汉式单例模式:
优点:简单,不存在线程同步问题,避免synchronized造成的资源浪费问题。
缺点:静态类被加载并分配空间,此后instance一直占用资源。
1 /** 2 * 饿汉模式 单例类在被编译加载时候,就实例化一个对象交给自己的引用 3 * */ 4 public class Singleton1 {
5 private Singleton1() { 6 } 7 8 private static Singleton1 instance = new Singleton1(); 9 10 public static Singleton1 getInstance() { 11 return instance; 12 } 13 14 }
三、懒汉式线程安全单例模式:
1 public class Singleton { 2 3 private static Singleton instance = null; 4 private Singleton(){} 5 public static synchronized Singleton getInstance(){ 6 if(instance==null){ 7 instance = new Singleton(); 8 } 9 return instance; 10 } 11 12 13 }
三、多线程下的懒汉模式:
优点是:使用synchronized关键字避免多线程访问时,出现多个SingletonTest实例。
缺点是:同步方法频繁调用时,效率略低。
1 /** 2 * 多线程下的懒汉模式 3 * 给懒汉式单例模式加锁,避免并发带来的错误,保证线程安全。 4 * */ 5 public class Singleton2 { 6 private Singleton2(){} 7 private static volatile Singleton2 instance = null; 8 public static synchronized Singleton2 getInstance(){ 9 if(instance==null){ 10 synchronized(Singleton2.class){ 11 if(instance==null){ 12 instance = new Singleton2(); 13 } 14 } 15 } 16 return instance; 17 } 18 }
使用场景:
单例模式的优点:
标签:test div 使用 定义 带来 bsp log 高性能 模式
原文地址:http://www.cnblogs.com/2017112wu/p/6687546.html