单例模式Singleton
主要作用是保证在Java应用程序中,一个类Class只有一个实例存在。
比如建立目录 ,数据库连接都需要这样的单线程操作
好处在于可以节省内存,因为它限制了实例的个数,有利于Java垃圾回收
//实现单例模式
①该类的构造器是private 私有的 使其不能被其他类创建(new)
②创建一个静态方法 返回该类的对象(唯一)
 
单例都是五种写法。懒汉,恶汉,双重校验锁,枚举和静态内部类。
下面是具体书写方式
package com.Spirit.singleton;

//饿汉式一(预加载) 不能用于多线程
/*public class Car {
    
    private static Car c = new Car();
    
    private  Car(){}
    public static Car getInstanse(){
        
        return c;
    }

}*/

 
//饿汉式二  不能用于多线程
/* 
private static class SingletonHolder{  
        /** 

         * 静态初始化器,由JVM来保证线程安全 

         */ 

        private static Singleton instance = new Singleton();  

    }  

    /** 

     * 私有化构造方法 

     */ 

    private Singleton(){  

    }  

    public static  Singleton getInstance(){  

        return SingletonHolder.instance;  

    }  

}*/
 
/*
//(懒汉,线程不安全):
public class Car{ 
private static Car car=null;    
private Car(){}  
  public static Car getInstance() {  
   if (instance == null) {        
car= new Car();    
return car; 
}
*/
//懒汉式 (懒加载、延迟加载) 线程安全
    但效率很低,99%情况下不需要同步。
/*
public class Car{
    
    private static Car c = null;
    
    private Car(){};
    
  public synchronized static Car getInstanse(){
      
      if(c==null){
         c =  new Car();
      }
        return c;
    }    
}*/
//静态内部内
public class Singleton {

private static class SingletonHolder {

private static final Singleton INSTANCE = new Singleton();

}

private Singleton (){}

public static final Singleton getInstance() {

return SingletonHolder.INSTANCE;

}

}

//枚举

public enum Singleton {   
  INSTANCE;    
public void whateverMethod() {  } 
 这种方式是Effective Java作者Josh Bloch 提倡的方式,它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,不过,个人认为由于1.5中才加入enum特 性,用这种方式写不免让人感觉生疏,在实际工作中,很少有人这样写。
//双锁机制(懒加载升级版  在多线程时会出现前一个未做处理,第二个开始加载的错误
所有多线程时都使用双锁保证加载完成)
public class Car{
    
private static Car c = null;
    
    private Car(){};
    
  public  static Car getInstanse(){
      
      if(c==null){
          synchronized (Car.class) {
              if(c==null){
              c =  new Car();
            }
      }
    }    
      return c;
}
 
}
 
需注意的问题:

1.如果单例由不同的类装载器装入,那便有可能存在多个单例类的实例。假定不是远端存取,

例如一些servlet容器对每个servlet使用完全不同的类装载器,这样的话如果有两个servlet访问一个单例类,它们就都会有各自的实例。

2.如果Singleton实现了java.io.Serializable接口,那么这个类的实例就可能被序列化和复原。

不管怎样,如果你序列化一个单例类的对象,接下来复原多个那个对象,那你就会有多个单例类的实例。

//第一种的修复方式:

private static Class getClass(String classname)

throws ClassNotFoundException {

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

if(classLoader == null)

classLoader = Singleton.class.getClassLoader();

return (classLoader.loadClass(classname));

}

}

//第二种的修复方式:

public class Singleton implements java.io.Serializable {

public static Singleton INSTANCE = new Singleton();

protected Singleton() {

}

private Object readResolve() {

return INSTANCE;

}

}

 
 

ooad单例模式-Singleton的更多相关文章

  1. 设计模式之单例模式——Singleton

                        设计模式之单例模式--Singleton 设计意图: 保证类仅有一个实例,并且可以供应用程序全局使用.为了保证这一点,就需要这个类自己创建自己的对象,并且对外有 ...

  2. 【白话设计模式四】单例模式(Singleton)

    转自:https://my.oschina.net/xianggao/blog/616385 0 系列目录 白话设计模式 工厂模式 单例模式 [白话设计模式一]简单工厂模式(Simple Factor ...

  3. iOS单例模式(Singleton)写法简析

    单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模式的要点有三个:一是某个类只能有一个实例: ...

  4. 浅谈设计模式--单例模式(Singleton Pattern)

    题外话:好久没写blog,做知识归纳整理了.本来设计模式就是个坑,各种文章也写烂了.不过,不是自己写的东西,缺少点知识的存在感.目前还没做到光看即能记住,得写.所以准备跳入设计模式这个大坑. 开篇先贡 ...

  5. 设计模式之——单例模式(Singleton)的常见应用场景

    单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...

  6. 设计模式之单例模式(Singleton Pattern)

    单例模式 单例模式(Singleton Pattern)在java中算是最常用的设计模式之一,主要用于控制控制类实例的数量,防止外部实例化或者修改.单例模式在某些场景下可以提高系统运行效率.实现中的主 ...

  7. 设计模式(4) -- 单例模式(Singleton)

    设计模式(4)  -- 单例模式(Singleton) 试想一个读取配置文件的需求,创建完读取类后通过New一个类的实例来读取配置文件的内容,在系统运行期间,系统中会存在很多个该类的实例对象,也就是说 ...

  8. IOS单例模式(Singleton)

    IOS单例模式(Singleton)   单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 1.单例模式的要点: 显然单例模 ...

  9. java设计模式之 单例模式 Singleton

    static 的应用 单例模式 Singleton 单例:保证一个类在系统中最多只创建一个实例. 好处:由于过多创建对象实例,会产生过多的系统垃圾,需要GC频繁回收,由于GC会占用较大的系统资源,所有 ...

随机推荐

  1. UML精粹1 - 简介

    Martin的主页 http://martinfowler.com/. Pavel Hruby开发的visio模板,可以用来画UML图: http://phruby.com 简介 统一建模语言UML是 ...

  2. CPS冥想 - 1 重新审视CPS

    这篇文章是在阅读Eric Lippert大神的MSDN Blog文章时同步写成的,其中主要是各种翻译,同时还混杂自己阅读文章的笔记和感想. 原博文地址 http://blogs.msdn.com/b/ ...

  3. ubuntu 下rar解压工具安装方法

    1.压缩功能安装 sudo apt-get install rar卸载 sudo apt-get remove rar2.解压功能安装 sudo apt-get install unrar卸载 sud ...

  4. Capture a Screen Shot

    using System; using System.Runtime.InteropServices; using System.Drawing; using System.Drawing.Imagi ...

  5. NGUI之UIRoot

    原文:http://www.tasharen.com/forum/index.php?topic=6710.0 概述 UIRoot总是放在NGUI UI层级的最上层. 它用来使UI的缩放变得更容易.w ...

  6. 60. Insert Interval && Merge Intervals

    Insert Interval Given a set of non-overlapping intervals, insert a new interval into the intervals ( ...

  7. 剑指Offer:面试题22——栈的压入,弹出序列(java实现)

    题目描述: 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...

  8. Clustering with the ArcGIS API for Flex

    Clustering is an excellent technique for visualizing lotss of point data. We've all seen application ...

  9. nodejs & nodemailer

    nodejs & nodemailer https://www.npmjs.com/package/nodemailer 上面的連接裏面 有有一個例子: 可以直接拿來用: 安裝依賴,在pack ...

  10. VMware 中windows server 之DHCP 搭建与测试

    感悟: 由于打算将windows server 的服务器搭建维护从头重新学习总结一下,遇到搭建dhcp服务的时候,在虚拟机中一直测试不成功,耽误我好几星期了,一点也不夸张,心情和积极性也大大受到打击. ...