在java中常常用的模式,这些模式是前人总结出来的精华,合理用好模式使我们的程序更健壮,更易维护...

  在这里我需要给大家介绍一款很简单的模式--单例模式。

  单列模式能够被状态化;这样,多个单态类在一起就可以作为一个状态仓库一样向外提供服务,比如,你要论坛中的帖子计数器,每次浏览一次需要计数,单态类能否保持住这个计数,并且能synchronize的安全自动加1,如果你要把这个数字永久保存到数据库,你可以在不修改单态接口的情况下方便的做到。

  单例模式在程序之中用的比较普遍,比如我们所做的购物车,系统提供创造日历函数等,这些都使用了单例模式的开发,那么单例模式有什么好处呢?什么是单例模式?一个一个问题就需要大家一同解决了。。。

  

单例模式应用于一个类只有一个实例的情况,并且为其实例提供一个全局的访问点。

特点

1.一个类只有一个实例

2.自己创建这个实例

3.整个系统只能用这个实例

应用场景

外部资源:每台计算机有若干个打印机,但只能有一个PrinterSpooler,以避免两个打印作业同时输出到打印机。

内部资源:大多数软件都有一个(或多个)属性文件存放系统配置,这样的系统应该有一个对象管理这些属性文件。

实现方式

1.饿汉式:单例实例在类装载时就构建,急切初始化。(预先加载法)

/*** 饿汉式(推荐)**/
public class Singleton1 {private Singleton1() {}public static Singleton1 instance = new Singleton1();public Singleton1 getInstance() {return instance;}}

优点 1.线程安全
2.在类加载的同时已经创建好一个静态对象,调用时反应速度快
缺点 资源效率不高,可能getInstance()永远不会执行到,但执行该类的其他静态方法或者加载了该类(class.forName),那么这个实例仍然初始化

2.懒汉式:单例实例在第一次被使用时构建,延迟初始化。

class Singleton2 {private Singleton2() {}public static Singleton2 instance = null;public static Singleton2 getInstance() {if (instance == null) {
              //多个线程判断instance都为null时,在执行new操作时多线程会出现重复情况instance = new Singleton2();}return instance;}
}

懒汉式在单个线程中没有问题,但在多线程就可能会出现两个或多个Singleton2实例情况,

虽然后面实例化的Singleton2会覆盖前面实例化的Singleton2,但最好避免这样的情况。

改进方式就是加锁synchornized

class Singleton3 {private Singleton3() {}public static Singleton3 instance = null;public static synchronized Singleton3 getInstance() {if (instance == null) {instance = new Singleton3();}return instance;}
}

优点 资源利用率高,不执行getInstance()就不会被实例,可以执行该类的其他静态方法
缺点 第一次加载时不够快,多线程使用不必要的同步开销大

3.双重检测

class Singleton4 {private Singleton4() {}public static Singleton4 instance = null;public static Singleton4 getInstance() {if (instance == null) {synchronized (Singleton4.class) {if (instance == null) {instance = new Singleton4();}}}return instance;}
}

优点 资源利用率高,不执行getInstance()就不被实例,可以执行该类其他静态方法
缺点 第一次加载时反应不快,由于java内存模型一些原因偶尔失败

4.静态内部类

class Singleton5 {private Singleton5() {}private static class SingletonHelp {static Singleton5 instance = new Singleton5();}public static Singleton5 getInstance() {return SingletonHelp.instance;}
}

优点 资源利用率高,不执行getInstance()不被实例,可以执行该类其他静态方法
缺点 第一次加载时反应不够快

总结:一般采用饿汉式(1),若对资源十分在意可以采用静态内部类(4),不建议采用懒汉式及双重检测(2、3)

另外

对于第二种可以采用volatile方式

volatile用更低的代价代替同步

解释:同步的代价主要有覆盖范围决定,如果可以降低同步的覆盖范围,可大幅提升性能。

而volatile覆盖范围是变量级别的,因此同步代价很低。

volatile原理:告诉处理器,不要将其放入工作内存,而是直接在主存操作。因此,当多处理器或多线程在访问该变量时

都将直接操作主存,这在本质上做到了变量共享。

volation优势:

1.更大的程度吞吐量

2.更少的代码实现多线程

3.程序伸缩性好

4.比较好理解,无需太高的学习成本

volatile不足:

1.容易出问题

2.比较难设计

参考文献

http://yiminghe.iteye.com/blog/404334

http://developer.51cto.com/art/201103/249322.htm

  

java设计模式--创建模式--单例模式相关推荐

  1. JAVA设计模式-创建模式-单例模式

    单例模式Singleton 为什么要有设计模式? 什么是单例模式? 为什么要有单例模式? 单例模式的常用实现方式 饿汉式 懒汉式 单例模式的其他实现方式 双重检查加锁double checked lo ...

  2. 10.Java设计模式 工厂模式,单例模式

    Java 之工厂方法和抽象工厂模式 1. 概念 工厂方法:一抽象产品类派生出多个具体产品类:一抽象工厂类派生出多个具体工厂类:每个具体工厂类只能创建一个具体产品类的实例. 即定义一个创建对象的接口(即 ...

  3. JAVA设计模式-创建模式-多例模式

    多例模式Multition 为什么要有设计模式? 什么是多例模式? 为什么要有多例模式? 多例模式的实现方式 鸣谢 为什么要有设计模式? 一个有价值的系统总是会因为需求的变化而变化,可能是原有需求的修 ...

  4. Java设计模式 创建模式-单态模式(Singleton)

    2019独角兽企业重金招聘Python工程师标准>>> 定义: Singleton模式主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 在很多操作中,比如建立目 ...

  5. JAVA设计模式-创建模式-工厂模式-简单工厂模式/静态工厂模式

    简单工厂模式Simple Factory 为什么要有设计模式? 简单工厂模式的类图 简单工厂模式的例子 产品 生产者 消费者 执行结果 后记 鸣谢 为什么要有设计模式? 一个有价值的系统总是会因为需求 ...

  6. JAVA设计模式 - 创建型模式总结

    JAVA设计模式 - 单例模式 JAVA设计模式 - 工厂方法模式 JAVA设计模式 - 抽象工厂模式 JAVA设计模式 - 原型模式 JAVA设计模式 - 建造者模式 1 . 创建型模式的定义 顾名 ...

  7. Java 设计模式——建造者模式(Builder Pattern)

    前言 一.简介 ​二.实现方式 三.常见第一种方式 (1)一般有以下几个角色 (2)举个例子 (3)具体步骤 (4)具体代码 三.第二种方式 (1)主要有三个角色:抽象建造者.具体建造者.产品 (2) ...

  8. Java设计模式——Builder模式

    前言 之前写Android程序的时候,经常会用到Dialog(对话框)这个控件.我们在使用Dialog,比如AlertDialog的时候就用到了这里要说明的Builder模式.现在我们来看一下这样的一 ...

  9. Java设计模式-工厂模式(3)抽象工厂模式

    在Java设计模式-工厂模式(2)工厂方法模式 我们知道了工厂方法模式解决了简单工厂模式中的缺陷,做到了满足开闭原则,但是时代是进步的,进而又产生新的问题,工厂难道只能生产一种东西吗.我们所见到的工厂 ...

  10. Java设计模式-工厂模式(1)简单工厂模式

    Java设计模式-工厂模式(1)简单工厂模式 一.前言 1)例子 2)类图关系 3)代码实现 二.简单工厂模式 2.1.概述: 2.2.类图关系: 2.3.代码修改: 2.4.优缺点 2.5.扩展-简 ...

最新文章

  1. 牛客网 华为机试题 数据重复的筛选问题记录
  2. Flask 模型操作
  3. WinCE NAND flash - FAL
  4. onnx模型部署(一) ONNXRuntime
  5. leetcode与python进阶学习总结
  6. Git管理工具对比(GitBash、EGit、SourceTree)(转载)
  7. 哈希表添加哈希表(Hash Table,也叫散列表),是根据键(Key)而直接访问在内存存储位置的数据结构。typedef enum{ HASH_OK, -icoding
  8. 【Flink】JobException: Recovery is suppressed by NoRestartBackoffTimeStrategy
  9. final关键字的用法
  10. bzoj1096 [ZJOI2007]仓库建设(斜率)
  11. excel打开csv乱码解决------------为什么pycharm里面csv不乱码,excel里面却乱码了
  12. Ubuntu入门——基础终端命令
  13. Java面试必看的18个开源项目
  14. 别以透明的名义降低人工智能的能力
  15. 如何将JPG免费转化成PDF
  16. GIS(地理信息系统)近年来应用及发展状态
  17. 马科维茨模型 matlab,马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(四)...
  18. 获取portal服务器信息超时,由于大量Portal用户同时认证导致Portal服务器处理报文超时造成一个Portal用户也认证不上的问题...
  19. 【GNN】循序渐进认识SSL
  20. Linux的du 和 df 的区别

热门文章

  1. paip.TechExcel DevSuite IIS 根目录结构
  2. PAIP.SQL的跟踪与调试
  3. Rust: trim(),trim_matches()等江南六怪......
  4. Julia: PostgreSQL数据库.......
  5. VS2015 C#6.0 中的那些新特性(转)
  6. 学无止境的 Linux | 龙蜥开发者说第4期
  7. Zephyr Team Hiring
  8. 召之即来,来之能战,战则必胜——走进华云数据交付团队
  9. 【通信】基于matlab GUI短波通信系统仿真【含Matlab源码 647期】
  10. 【路径规划】基于matlab蚁群算法无人机巡检路径规划【含Matlab源码 138期】