java单例模式(Singleton)以及实现

一. 什么是单例模式

  因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计。

二. 单例模式的特点

  1. 单例模式只能有一个实例。

  2. 单例类必须创建自己的唯一实例。

  3. 单例类必须向其他对象提供这一实例。

三. 单例模式与静态类区别

  在知道了什么是单例模式后,我想你一定会想到静态类,“既然只使用一个对象,为何不干脆使用静态类?”,这里我会将单例模式和静态类进行一个比较。

  1. 单例可以继承和被继承,方法可以被override,而静态方法不可以。

  2. 静态方法中产生的对象会在执行后被释放,进而被GC清理,不会一直存在于内存中。

  3. 静态类会在第一次运行时初始化,单例模式可以有其他的选择,即可以延迟加载。

  4. 基于2, 3条,由于单例对象往往存在于DAO层(例如sessionFactory),如果反复的初始化和释放,则会占用很多资源,而使用单例模式将其常驻于内存可以更加节约资源。

  5. 静态方法有更高的访问效率。

  6. 单例模式很容易被测试。

四.几个关于静态类的误解:

  误解一:静态方法常驻内存而实例方法不是。

  实际上,特殊编写的实例方法可以常驻内存,而静态方法需要不断初始化和释放。

  误解二:静态方法在堆(heap)上,实例方法在栈(stack)上。

  实际上,都是加载到特殊的不可写的代码内存区域中。

五.静态类和单例模式情景的选择:

  情景一:不需要维持任何状态,仅仅用于全局访问,此时更适合使用静态类。

  情景二:需要维持一些特定的状态,此时更适合使用单例模式。

六.本人特意写了一个单例的详细代码献上 (主要是单例懒汉式,饿汉式详解)

创建一个学生Student对象,写成两个类,饿汉式为Student_1,懒汉式为Student_2
1 public class Student_1 {
//饿汉式
private static Student_1 student = new Student_1();
public static Student_1 newInstance() {
return student;
} public Student_1() {
System.out.println("饿汉式创建对象");
}
} class Student_2 {
//懒汉式
private static Student_2 student2; static Student_2 newInstance2() {
//提高效率,如果第一次创建对象成功,后面就不用进入同步当中,直接返回对象即可
if (student2 == null) {
synchronized (Student_1.class) {
//如果是第一次调用方法,进入if,创建对象
if (student2 == null) {
student2 = new Student_2();
}
}
}
return student2;
} public Student_2() {
System.out.println("懒汉式双重检验创建对象");
} }
 public class Danli_1 {
/*
* 单例:一个类只允许被创建1次对象
* 饿汉式 HungrySingLeton
* 懒汉式 LazySingLeton
*/ public static void main(String[] args) {
/*
* 单例:一个类只允许被创建1次对象
* 饿汉式 HungrySingLeton
* 1:构造器私有化
* 2:初始化一个私有静态的对象
* 3:提供一个公开的静态的获取对象的方法
* 注意
* 1:对象产生的时间:类加载的时候就被创建了
* 优点:代码简单,安全性较高
* 缺点:创建对象时机过早,有可能会浪费内存空间
* 懒汉式 LazySingLeton
*/ Student_1 s =Student_1.newInstance();
/*
* 单例:懒汉式:什么时候用什么时候创建对象
* 1:构造器私有化
* 2:声明一个私有的静态的对象变量
* 3:提供一个公开的静态获取对象的方法
*
* 注意:创建时间恰当
* 注意:多线程的情况下,容易出现多个对象
* 使用双重校验法
*/
Student_2 s2 =Student_2.newInstance2(); }
}

Java的异常机制:链接:https://pan.baidu.com/s/1mFhLXCwM071JPNPVKZIoRA  提取码:eiok 

java-单例详解的更多相关文章

  1. iOS单例详解

    单例:整个程序只创建一次,全局共用. 单例的创建 // SharedPerson.h 文件中 + (instancetype)share; // SharedPerson.m 文件中 static S ...

  2. 【Java学习笔记之三十】详解Java单例(Singleton)模式

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  3. Java 序列化Serializable详解

    Java 序列化Serializable详解(附详细例子) Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化Serialization(序列化)是一种将对象以一连 ...

  4. 最新java数组的详解

    java中HashMap详解 http://alex09.iteye.com/blog/539545 总结: 1.就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java ...

  5. JAVA IO 类库详解

    JAVA IO类库详解 一.InputStream类 1.表示字节输入流的所有类的超类,是一个抽象类. 2.类的方法 方法 参数 功能详述 InputStream 构造方法 available 如果用 ...

  6. 【转】 java中HashMap详解

    原文网址:http://blog.csdn.net/caihaijiang/article/details/6280251 java中HashMap详解 HashMap 和 HashSet 是 Jav ...

  7. JAVA命令参数详解

    JAVA命令参数详解 JAVA命令详解 结构 说明 Java 和 OldJava JIT 选项 另请参阅 结构 java [ options ] class [ argument ... ] java ...

  8. Java 序列化Serializable详解(附详细例子)

    Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...

  9. java中HashMap详解(转)

    java中HashMap详解 博客分类: JavaSE Java算法JDK编程生活       HashMap 和 HashSet 是 Java Collection Framework 的两个重要成 ...

  10. java集合(2)- java中HashMap详解

    java中HashMap详解 基于哈希表的 Map 接口的实现.此实现提供所有可选的映射操作,并允许使用 null 值和 null 键.(除了非同步和允许使用 null 之外,HashMap 类与 H ...

随机推荐

  1. 二:maven构建module

    通常情况下,我们一个项目是需要分多个模块的,这是我们用maven管理项目就需要构建一个多模块的项目: 通常的结构是一个模块中有一个主项目,下面包含多个子项目,如果是web项目则子项目中有一个是java ...

  2. vmware安装——CentOS-6.5和Mysql

    1.新建虚拟机 2.安装centos6.5 3.centos设置 查看网络 4.vmware设置网络连接 关闭selinux [root@china ~]# vim /etc/selinux/conf ...

  3. POJ 1015

    #include<iostream> #include<algorithm> #define MAXN 201 #define count C_ount using names ...

  4. 机器大数据也离不开Hadoop

    转自:http://gtstorageworld.blog.51cto.com/908359/1286758 根据数据来源划分,大数据主要包括三类:商业运作产生的数据.人类行为产生的数据和机器数据.目 ...

  5. EF基础知识小记三(设计器=>数据库)

    本文主要介绍通过EF的设计器来同步数据库和对应的实体类.并使用生成的实体上下文,来进行简单的增删查该操作 1.通过EF设计器创建一个简单模型 (1).右键目标项目添加新建项 (2).选择ADO.Net ...

  6. Sington单例模式(创建型模式)

    一.使用Sington单例模式的动机(Motivation) 在软件系统中,经常有一些特殊的类,必须保证它们只有一个实例,才能保证它的逻辑正确性.以及良好的效率. 大多数类用的是常规的构造器,所以往往 ...

  7. Vue路由-命名视图实现经典布局

    Vue路由-命名视图实现经典布局 相关Html: <!DOCTYPE html> <html lang="en"> <head> <met ...

  8. spring boot整合RabbitMQ(Topic模式)

    1.Topic交换器介绍 Topic Exchange 转发消息主要是根据通配符. 在这种交换机下,队列和交换机的绑定会定义一种路由模式,那么,通配符就要在这种路由模式和路由键之间匹配后交换机才能转发 ...

  9. hibernate的配置文件,使用XML方式

    <?xml version="1.0" encoding="UTF-8"?> <!-- 标准的XML文件的起始行,version='1.0'表 ...

  10. Architecture of a Java Compiler

    Architectural Overview   A modern optimizing compiler can be logically divided into four parts:   Th ...