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. MySQL(ORM框架)

    day63 参考:http://www.cnblogs.com/wupeiqi/articles/5713330.html SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件, ...

  2. sql语句_统计总成绩最高的前2名

    有一个数据表,id user_id score 三个字段,计算总成绩最高的前两名 SELECT * FROM (SELECT user_name,SUM(score) AS score FROM us ...

  3. 使用jquery怎么选择有两个class的元素?

    实例: 我们想要选择class为:box_list clearfix 的div <div class="box_list clearfix" style="z-in ...

  4. Myeclipse中java项目转成Web项目

    在eclipse导入一个myeclipse建的web项目后,在Eclipse中显示的还是java项目,按下面的步骤可以将其转换成web项目. 1.找到项目目录下的.project文件 2.编辑.pro ...

  5. ThreadLocal模式与synchronized关键字的比较

    ThreadLocal模式与synchronized关键字都是用于处理多线程并发访问变量的问题.只是两者处理问题的角度和思路不同. 1)ThreadLocal是一个Java类,通过对当前线程(Thre ...

  6. Swift 里字符串(四)large sting

    对于普通的字符串,对应的_StringObject 有两个存储属性: _countAndFlagsBits: UInt64 _object: Builtin.BridgeObject _countAn ...

  7. Python小白学习之路(十九)—【文件操作步骤】【文件操作模式】

    一.文件操作步骤 step1:打开文件,得到文件句柄并赋值给一个变量step2:通过句柄对文件进行操作step3:关闭文件 举例: a = open('hello world', 'r', encod ...

  8. 线程安全单例最佳实践,C#中的Lazy是如何保证线程安全的

    在.NET 4.0之后,.NET Framework中提供了一种安全的延迟加载类型LazyLazy能够在多线程环境下,保证GetValue函数只执行一次,从而实现单例模式 在过去,实现单例模式我们通常 ...

  9. hive与hbase的整合

    Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行.其优点学习成本低,可以通过类S ...

  10. 编写Android程序Eclipse连不上手机。

    主要问题有: 1.开发者选项没有开启 2.设备管理器中MTP有黄色小叹号 3.ADB异常. 问题1容易解决. 问题2,3困扰了我很长时间,网上的很多解决方法是下载安装MTP驱动,或者直接右击更新驱动. ...