单利模式:本来是不准备写的,但是最近发现好多公司面试时都会或多或少的提到单利模式,因此今天把单利模式拉出来说说。

定义:只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。(这是百度百科上的定义)

应用场景:是这样的,有些时候在程序的运行过程中,你不想要重复创建同一个类的多个对象(这回造成内存使用过量,对程序的性能不利),这是单利模式就是一个很好的选择,因为它能够保证程序运行时始终仅且仅有一个对象被创建。

优点:

1、控制资源的使用,通过线程同步来控制资源的并发访问;

2、控制实例产生的数量,达到节约资源的目的。

3、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不

相关的两个线程或者进程之间实现通信。

单利模式的种类:

1.懒汉式

2.饿汉式

单利模式的特点:

1.单利只能有一个实例(即构造方法必须为私有的即private)

2.单利必须自己给自己创建一个能够保证唯一性的实例

3.单利必须提供一个共有的方法来返回它自己的唯一实例

饿汉模式介绍:

依据的原理:根据JLS(Java Language Specification)中的规定,一个类在一个ClassLoader中只会被初始化一次,这点是JVM本身保证的

因此创建后就不会有多例的问题。

优点:

  1.创建方便

  2.效率高  

缺点:

  1.对内存的使用量较大

应用场景:适用于小对象,对于过于大的对象就应该考虑适用懒汉时的了。

以下上饿汉模式的代码:

public class Singleton {
private Singleton(){}
private static final Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
} }

懒汉模式介绍:

懒汉模式,适用于所有的应用场景,但是要做过多的判断,相对来说它会影响程序的运行性能。

优点:

  1.适用于所有的应用场景

  2.使用时占内存较小(只有在使用的时候才会被创建)

缺点:

  1.性能较低

  2.书写较为繁琐

先看看一个简单的懒汉式例子:

    private Singleton(){}
private static Singleton instance = null;
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}

这段代码有什么问题呢?

对了,这段代码仅适用于单线程应用。对于多线程并发操作并没有做处理。这就会导致代码在运行是并不能保证程序中的对象在运行时始终是唯一的。

下面给出一个相对较好的单利模式:

private Singleton(){}//保证在类的外部对象并不会创建
private static Singleton instance = null;
public static Singleton getInstance(){//给外部提供一个范文自身的方法
if(instance == null){
synchronized (Singleton.class) {
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}

下面介绍一个对性能影响较小,又能保证内存使用量的单利模式

public class Singleton {
private Singleton(){}
//该类为静态私有内部类,只有外部类才能够调用
private static class PrivateSingleton{
//保证对象的唯一性。
static final PrivateSingleton instance = new PrivateSingleton();
}
public static PrivateSingleton getInstance(){
return PrivateSingleton.instance;
} }

以上这段代码,首先保证了该类的对象不会被外部类创建实例,而且解决了多线程并发的问题。

好了,单列模式就先介绍到这里。下面给大家一个链接,上面有单利的详细介绍,提供了6中单利的创建模式。有兴趣的朋友可以看看

http://www.iteye.com/topic/575052

Java中的单利模式介绍的更多相关文章

  1. Java中的单利模式

    单利模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创 ...

  2. PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化)/约束类型/魔术方法小结

      前  言  OOP  学习了好久的PHP,今天来总结一下PHP中的抽象类与抽象方法/静态属性和静态方法/PHP中的单利模式(单态模式)/串行化与反串行化(序列化与反序列化). 1  PHP中的抽象 ...

  3. (转)轻松学,Java 中的代理模式及动态代理

    背景:讲到反射机制,肯定会想到动态代理. 轻松学,Java 中的代理模式及动态代理 代理模式可以在不修改被代理对象的基础上,通过扩展代理类,进行一些功能的附加与增强.值得注意的是,代理类和被代理类应该 ...

  4. Java基础-JAVA中常见的数据结构介绍

    Java基础-JAVA中常见的数据结构介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是数据结构 答:数据结构是指数据存储的组织方式.大致上分为线性表.栈(Stack) ...

  5. Java 设计模式之单利模式

    一.首先介绍一下单例模式:     单例模式(Singleton),也叫单子模式,是一种常用的软件设计模式.在应用这个模式时,单例对象的类必须保证只有一个实例存在.许多时候整个系统只需要拥有一个的全局 ...

  6. Java设计模式之单利模式(Singleton)

    单利模式的应用场景: 单利模式(Singleton Pattern)是指确保一个类在任何情况下都绝对只有一个实例.并提供一个全局反访问点.单利模式是创建型模式.单利模式在生活中应用也很广泛,比如公司C ...

  7. 安卓中的Model-View-Presenter模式介绍

    转载自:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0425/2782.html 英文原文:Introduction to M ...

  8. JAVA中的单利

    单列:单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种.单例模式有一下特点:1.单例类只能有一个实例.2.单例类必须自己自己创建自己的唯一实例.3.单例类必须给所有其他对象提供这一实例. 一.懒 ...

  9. Java中的代理模式

    代理模式在Java Web的框架中经常使用到.比如说在对数据库的访问中,核心功能是对数据库的增删改查,而连接数据库.处理事务等功能我们在开发中也要考虑到.所以我们将数据库的CRUD抽象到接口中,然后实 ...

随机推荐

  1. js-ES6学习笔记-编程风格(1)

    1.ES6提出了两个新的声明变量的命令:let和const.其中,let完全可以取代var,因为两者语义相同,而且let没有副作用. 2.var命令存在变量提升效用,let命令没有这个问题.建议不再使 ...

  2. idea配置热部署

    第一步:添加依赖使用spring-boot-devtools提供的开发者工具spring-boot项目中引入如下依赖 <dependency><groupId>org.spri ...

  3. JavaSE——多线程实现的两种方式

    Thread类: 创建新执行线程有两种方法. 一种方法是将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法.接下来可以分配并启动该子类的实例.例如,计算大于某一规定值的质 ...

  4. python 日志打印之logging使用介绍

    python 日志打印之logging使用介绍 by:授客QQ:1033553122 测试环境: Python版本:Python 2.7   简单的将日志打印到屏幕 import logging lo ...

  5. 安卓开发实用技巧:TextView预览

    背景: 使用TextView时,为了方便在开发工具中预览效果,需要在TextView中设置文字(如:android:text="Hello World"),但是等到后面提交时,为了 ...

  6. zabbix系列之监控类型及方式

    http://www.ttlsa.com/zabbix/how-to-chose-zabbix-item-type/ zabbix提供十几种监控类型: 监控类型 特性 备注 Zabbix agent ...

  7. 在PHP中避免一些代码中的坏味道

    做PHP开发已经有快一年的时间了,在这一年的时间中,学习了很多生产环境中的技巧,学习了很多东西,期间也阅读了一些优秀的源码和关于代码的书,对写代码这一块有了一定的思考,也看过很多别人写的好的代码和坏的 ...

  8. centos6.5安装mysql

    1.yum -install  mysql mysql-server -y 2.修改mysql的root的密码 登录:mysql -uroot        修改密码:            use ...

  9. HDFS Lease Recovey 和 Block Recovery

    这篇分析一下Lease Recovery 和 Block Recovery hdfs支持hflush后,需要保证hflush的数据被读到,datanode重启不能简单的丢弃文件的最后一个block,而 ...

  10. DataContract和DataMember的作用

    数据契约(DataContract)里的DataMember特性  来源于网络,用于个人收集及备忘 数据契约(DataContract) 服务契约定义了远程访问对象和可供调用的方法,数据契约则是服务端 ...