剑指offer之实现Singleton(单例)模式

来源:互联网 发布:精益数据分析 微盘 编辑:程序博客网 时间:2024/05/16 08:20

在面试的过程中,很多公司常考察单例模式,并且需要手写代码。

单例模式的特点:

  1、单例类只能有一个实例。
  2、单例类必须自己创建自己的唯一实例。

  3、单例类必须给所有其他对象提供这一实例。


第一种:懒汉式单例模式

  1. //懒汉式单例类.在第一次调用的时候实例化自己   
  2. public class Singleton {  
  3.     //私有的默认构造子  
  4.     private Singleton() {}  
  5.     //注意,这里没有final      
  6.     private static Singleton single=null;  
  7.     //静态工厂方法   
  8.     public static Singleton getInstance() {  
  9.          if (single == null) {    
  10.              single = new Singleton();  
  11.          }    
  12.         return single;  
  13.     }  
  14. }  

  Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。但是,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。而且,它是线程不安全的。如果要把懒汉式用于多线程,有两种方式保证安全性,一种是在getInstance方法上加同步,另一种是在使用该单例方法前后加双锁。


第二种:饿汉式单例模式

  1. //饿汉式单例类.在类初始化时,已经自行实例化   
  2. public class Singleton1 {  
  3.     //私有的默认构造子  
  4.     private Singleton1() {}  
  5.     //已经自行实例化   
  6.     private static final Singleton1 single = new Singleton1();  
  7.     //静态工厂方法   
  8.     public static Singleton1 getInstance() {  
  9.         return single;  
  10.     }  
  11. }  

     饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的。




0 0
原创粉丝点击