一.问题引入

偶然想想到的如果把Java的构造方法弄成private,那里面的成员属性是不是只有通过static来访问呢;如果构造方法是private的话,那么有什么好处呢;如果构造方法是private的话,会不更好的封装该内呢?我主要是应用在使用普通类模拟枚举类型里,后来发现这就是传说中的单例模式。构造函数弄成private 就是单例模式,即不想让别人用new 方法来创建多个对象,可以在类里面先生成一个对象,然后写一个public static方法把这个对象return出去。(eg:public 类名 getInstancd(){return 你刚刚生成的那个类对象;}),用static是因为你的构造函数是私有的,不能产生对象,所以只能用类名调用,所有只能是静态函数。成员变量也可以写getter/setter供外界访问的。如果谁要用这个类的实例就用有兴趣的读者参看原作者这一篇博文http://www.cnblogs.com/hxsyl/archive/2013/03/18/2966360.html。

第一个代码不是单例模式,也就是说不一定只要构造方法是private的就是单例模式。

View Code

View Code

二.单例模式概念及特点

java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。

单例模式有一下特点:

1、单例类只能有一个实例。

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

3、单例类必须给所有其他对象提供这一实例。

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。

正是由于这个特 点,单例对象通常作为程序中的存放配置信息的载体,因为它能保证其他对象读到一致的信息。例如在某个服务器程序中,该服务器的配置信息可能存放在数据库或 文件中,这些配置数据由某个单例对象统一读取,服务进程中的其他对象如果要获取这些配置信息,只需访问该单例对象即可。这种方式极大地简化了在复杂环境 下,尤其是多线程环境下的配置管理,但是随着应用场景的不同,也可能带来一些同步问题。

三.典型例题

首先看一个经典的单例实现。

1 public class Singleton {

2

3 private static Singleton uniqueInstance = null;

4

5

6

7 private Singleton() {

8

9 // Exists only to defeat instantiation.

10

11 }

12

13

14

15 public static Singleton getInstance() {

16

17 if (uniqueInstance == null) {

18

19 uniqueInstance = new Singleton();

20

21 }

22

23 return uniqueInstance;

24

25 }

26

27 // Other methods...

28

29 }

Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。(事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在。)

但是以上实现没有考虑线程安全问题。所谓线程安全是指:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。显然以上实现并不满足线程安全的要求,在并发环境下很可能出现多个Singleton实例。

View Code

View Code

运行结果:

张孝祥

张孝祥

output message 张孝祥

output message 张孝祥

创建的是同一个实例

结论:由结果可以得知单例模式为一个面向对象的应用程序提供了对象惟一的访问点,不管它实现何种功能,整个应用程序都会同享一个实例对象。

其次,下面是单例的三种实现。

1.饿汉式单例类

飞哥下面这个可以不加final,因为静态方法只在编译期间执行一次初始化,也就是只会有一个对象。

1 //饿汉式单例类.在类初始化时,已经自行实例化

2 public class Singleton1 {

3 //私有的默认构造子

4 private Singleton1() {}

5 //已经自行实例化

6 private static final Singleton1 single = new Singleton1();

7 //静态工厂方法

8 public static Singleton1 getInstance() {

9 return single;

10 }

11 }

首先final关键词是代表此变量一经赋值,其指向的内存引用地址将不会再改变。

其次,线程安全和加不加final没有什么区别,打个经典的比方,两个人同时看到了桌上的一个蛋糕,于是两个人都坐下并拿起刀叉,但实际上有个人在叉向蛋糕的一瞬间,这个蛋糕被另一个人吃掉了,这就引起了错误,具体的例子还有很多。

解决线程安全的方法有好几个,比如楼主需要将所有操作此变量的方法加上排他锁,即方法声明时加上synchronized关键词(前提是这几个方法与这个需要保护的变量处在同一个类中)

2.懒汉式单例类

那个if判断确保对象只创建一次。

1 //懒汉式单例类.在第一次调用的时候实例化

2 public class Singleton2 {

3 //私有的默认构造子

4 private Singleton2() {}

5 //注意,这里没有final

6 private static Singleton2 single=null;

7 //静态工厂方法

8 public synchronized static Singleton2 getInstance() {

9 if (single == null) {

10 single = new Singleton2();

11 }

12 return single;

13 }

14 }

java单例接口_JAVA单例模式相关推荐

  1. java 单例写法_java 单例模式的几种写法

    一.懒汉式 public classSingleton{private static Singleton instance = null;privateSingleton(){}public stat ...

  2. java单例方法_Java单例模式

    单例模式,是特别常见的一种设计模式,因此我们有必要对它的概念和几种常见的写法非常了解,而且这也是面试中常问的知识点. 所谓单例模式,就是所有的请求都用一个对象来处理,如我们常用的Spring默认就是单 ...

  3. java单例设计模式_Java设计模式之单例模式详解

    在Java开发过程中,很多场景下都会碰到或要用到单例模式,在设计模式里也是经常作为指导学习的热门模式之一,相信每位开发同事都用到过.我们总是沿着前辈的足迹去做设定好的思路,往往没去探究为何这么做,所以 ...

  4. java单例枚举_Java增强枚举的用例

    java单例枚举 Brian Goetz在消息" 增强枚举-用例 "中写道:"我们希望就现在实现的功能[ 增强枚举 ]获得用户反馈." 他陈述了他的消息的第一个 ...

  5. java单例代码_java中的单例模式的代码怎么写

    单例模式在我们日常的项目中十分常见,当我们在项目中需要一个这样的一个对象,这个对象在内存中只能有一个实例,这时我们就需要用到单例. 一般说来,单例模式通常有以下几种: 1.饥汉式单例 public c ...

  6. java+单例+恶汉_Java设计模式之单例模式(恶汉式和懒汉式)

    /** 单例模式:* 饿汉式:类一加载就创建对象* 懒汉式:用的时候,才去创建对象* 面试题:单例模式的思想是什么?写一个代码体现(我们最好写懒汉式的单例模式给面 /* * 单例模式: *       ...

  7. java 单例类_Java单例类

    单例类: 主要知识点: 1,单例类概念.特点 2,三种单例类懒汉,饿汉,双重加锁举例, 3,懒汉.饿汉区别以及单例类的总结: 1,概念:java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单 ...

  8. java 单例 实现_java 实现单例的各种方式

    概述 上一篇日志中,我们介绍了单例模式的概念和基础的应用 本节中,我们就来介绍一下 java 语言中如何编写单例模式类 只适合单线程环境的单例模式 public class Singleton { p ...

  9. java 单例 性能_java程序性能优化之设计优化---单例pk

    对于单例,很多人就要问了.为什么要使用单例,单例意义何在? 单例的产生是由于类的频繁使用,每次生成对象都要new,使用完值后GC要释放对象.这样一来系统性能降低,GC承受着巨大的压力.为了能够提升系统 ...

  10. java 单例 dcl_java 中单例模式DCL的缺陷及单例的正确写法

    1 前言 单例模式是我们经常使用的一种模式,一般来说很多资料都建议我们写成如下的模式: /** * Created by qiyei2015 on 2017/5/13. */ public class ...

最新文章

  1. 常识性概念图谱建设以及在美团场景中的应用
  2. python语句中ord_浅谈Python中chr、unichr、ord字符函数之间的对比
  3. 初读设计模式-----《design pattern explained》读后感
  4. c/c++ / printf 实现
  5. java自学方法_JAVA自学 方法
  6. ADO.NET笔记——基本概念
  7. Web前端笔记-移动端触屏移动视角(two.js)
  8. Java描述设计模式(08):桥接模式
  9. c语言变量生存期,C语言变量的生命周期
  10. 【skimage.util.shape】有关view_as_windows裁剪数组及恢复的简单尝试
  11. 2021-08-03 SELECT简单查询
  12. html 模拟鼠标移动,如何在网页端用js模拟鼠标移动点击等操作
  13. Solidworks二次开发环境搭建(Net)
  14. Unicode中的数学符号
  15. widows 程序无响应判断,程序假死状态
  16. python柱形图绘制_Python绘图之柱形图绘制详解
  17. 轻松使用中移物联网平台Onenet,MQTT协议快速接入实验,使用Onenet平台MQTT协议开发个人智能设备的解决方案
  18. [Tips]Ubuntu20.04域名解析失败或网速很慢
  19. 呵呵,原来梦醒后一切这么美好(KK记)
  20. 黄河科技学院计算机等级考试成绩查询,全国计算机等级考试成绩查询汇总

热门文章

  1. 如何设置.net控件SplitContainer平均分配
  2. airtest基本介绍
  3. 游戏测试----------------第4章
  4. stagefright框架
  5. 如何轻松集成VARCHART XGantt
  6. 平稳性的检验 java_[时间序列分析]--平稳性,白噪声的检验
  7. C# ZPL打印标签
  8. 招聘 | 清华大学计算机系知识工程实验室博士后
  9. iOS8 web下载ipa install App via OTA
  10. opencv实现人脸识别中过曝光人脸图片处理