• 设计模式之单例模式


    单例对象(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 }  

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

  • 相关阅读:
    Java知识汇总第二天
    jvm学习笔记
    java知识汇总的第一天
    全链路压测流量模型
    FunTester测试框架Redis性能测试实践
    FunTester抄代码之路
    Jira API的踩坑记
    把工作讲给家人听
    颇具年代感的《JMeter中文操作手册》
    FunTester框架Redis压测预备
  • 原文地址:https://www.cnblogs.com/lixiuyu/p/5911452.html
Copyright © 2020-2023  润新知