单例模式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. [家里蹲大学数学杂志]第049期2011年广州偏微分方程暑期班试题---随机PDE-可压NS-几何

    随机偏微分方程 Throughout this section, let $(\Omega, \calF, \calF_t,\ P)$ be a complete filtered probabili ...

  2. view--4种Android获取View宽高的方式

    有时我们会有基于这样的需求,当Activity创建时,需要获取某个View的宽高,然后进行相应的操作,但是我们在onCreate,onStart中获取View的大小,获取到的值都是0,只是由于View ...

  3. ConfigParser.MissingSectionHeaderError: File contains no section headers.

    今天使用ConfigParser解析一个ini文件,报出如下错误: config.read(logFile) File "C:\Python26\lib\ConfigParser.py&qu ...

  4. 使用chrome联调不在同一个域的请求

    做前端的,用Ajax获取数据,是常有的事情,同域下自然没问题了,如果是不同域获取数据,浏览器就有个同源策略的限制. Origin * is not allowed by Access-Control- ...

  5. java变量命名规则

    1.      变量必须以字母,下划线”_”或”$”符号开 2.      变量可以包括数字,但不能以数字开 3.      除了下划线”_”和”$”符号以外,变量名不能包含任何特殊字符 4.     ...

  6. archlinux 传统方法编译内核linux kernel 3.3.7

    From: http://hi.baidu.com/flashgive/item/eaef6326b5eb73d3a417b662 archlinux中传统方法编译内核 1)下载内核以及补丁并解压: ...

  7. js获取节点的DOM操作

    一直感觉DOM节点什么的乱七八糟的不能理解,可能博客也没办法写清楚,只能把知道的一些信息大致写下来慢慢再补充了. HTML DOM类型 Node类型 Javascript中的所有节点类型都继承自Nod ...

  8. NHibernate系列文章十四:NHibernate事务

    摘要 NHibernate实现事务机制非常简单,调用ISession.BeginTransaction()开启一个事务对象ITransaction,使用ITransaction.Commit()提交事 ...

  9. IT在线笔试总结(一)

    综述:IT公司的技术类笔试,主要考察: (1)知识面的广度.主要考察一些业内通用性的知识,以及某一职务所必须具备的业务知识. (2)智力测试.主要考察记忆力,思维能力和学习新知识的能力. (3)技能测 ...

  10. 使用View为Data Source的Form开发要点

    (Data Source为View) 要点一:创建View的SQL语法 View的SQL里必须指定Form里唯一一个对其新增.修改.删除的基本表及其主键,其它表为辅助信息表,其字段仅用来在Form里显 ...