1,单例模式

解法一:只适用于单线程:

package com.singleton;import sun.security.jca.GetInstance.Instance;public class Singleton1 {private static Singleton1 instance = null;public Singleton1() {}public static Singleton1 getInstance() {if (instance == null) {instance = new Singleton1();}return instance;}public static void main(String[] args) {// TODO Auto-generated method stub
Singleton1 s1 = getInstance();Singleton1 s2 = getInstance();System.out.println(s1==s2);}}

解法二:适用于多线程但效率不高----在getInstance()上加synchronized加锁

package com.singleton;public class Singleton1 {private static Singleton1 instance = null;public Singleton1() {}public static synchronized Singleton1 getInstance() {if (instance == null) {instance = new Singleton1();}return instance;}public static void main(String[] args) {// TODO Auto-generated method stub
Singleton1 s1 = getInstance();Singleton1 s2 = getInstance();System.out.println(s1==s2);}}

解法三:改进的多线程单例----不需要整个方法加锁,只需要创建时加锁

package com.singleton;public class Singleton1 {private static Object lock = new Object();private static Singleton1 instance = null;public Singleton1() {}public static Singleton1 getInstance() {if (instance == null) {synchronized (lock) {if (instance == null) {instance = new Singleton1();}}}return instance;}public static void main(String[] args) {// TODO Auto-generated method stub
Singleton1 s1 = getInstance();Singleton1 s2 = getInstance();System.out.println(s1==s2);}}

解法四(强烈推荐):利用静态构造函数

package com.singleton;public class Singleton2 {private static Singleton2 instance = new Singleton2();public static Singleton2 getInstance() {return instance;}public static void main(String[] args) {// TODO Auto-generated method stub
Singleton2 s1 = getInstance();Singleton2 s2 = getInstance();System.out.println(s1 == s2);}}

原理:类成员变量只在类加载时初始化一次。

解法五(强烈推荐):

package com.singleton;public class Singleton3 {private static class SingletonHolder {private final static Singleton3 instance = new Singleton3();}public Singleton3() {}public static Singleton3 getInstance() {return SingletonHolder.instance;}public static void main(String[] args) {Singleton3 s1 = getInstance();Singleton3 s2 = getInstance();System.out.println(s1 == s2);}}

因为SingletonHolder内部类只有在显式被调用时才会加载,所以只有在调用getInstance方法时才会实例化instance,这样就解决了解法四加载过早的问题。

转载于:https://www.cnblogs.com/IvySue/p/7529001.html

Java实现单例模式相关推荐

  1. Java学习-----单例模式

    一.问题引入 偶然想想到的如果把Java的构造方法弄成private,那里面的成员属性是不是只有通过static来访问呢:如果构造方法是private的话,那么有什么好处呢:如果构造方法是privat ...

  2. Java 的单例模式

    Java 的单例模式 单例模式(Singleton) 单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法.如果我们要让类在一个 ...

  3. Java 进阶——单例模式

    一.单例模式概念及特点         Java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必 ...

  4. Java创建单例模式(singleton)的几种实现方式

    JAVA的单例模式(singleton) 一.什么是单例模式? 1. 优点 2. 缺点 3. 使用场景 二.什么是线程安全和非线程安全? 1.线程安全 2.非线程安全 3.线程安全与不安全的本质区别 ...

  5. Java 设计模式 - 单例模式

    Java 设计模式 - 单例模式 作者: 霍英俊 [huo920@live.com] 文章目录 Java 设计模式 - 单例模式 单例设计模式介绍 单例设计模式八种方式 饿汉式 - 静态常量 饿汉式( ...

  6. java之单例模式祥解

    java之单例模式祥解 收藏 转自javaeye的作者calmness,看完以后我很佩服,他的连接地址: http://www.javaeye.com/topic/60179 概要 单例模式是最简单的 ...

  7. java中单例的应用_浅谈Java中单例模式的几种应用

    目录 浅谈Java中单例模式的几种应用 第一种:懒汉式 第二种:饿汉式 第三种:双重检索式 第四种:注册登记式 第五种:内部类形式 浅谈Java中单例模式的几种应用 日常开发中,为了提高我们系统中对象 ...

  8. java设计模式---单例模式

    关于单例模式的文章,其实网上早就已经泛滥了.但一个小小的单例,里面却是有着许多的变化.网上的文章大多也是提到了其中的一个或几个点,很少有比较全面且脉络清晰的文章,于是,我便萌生了写这篇文章的念头.企图 ...

  9. Java 实现单例模式的 9 种方法

    一. 什么是单例模式 因进程需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 二. 单例模式的特点 单例模式只能有一个实例. 单例类必须创建自己的唯一实 ...

  10. Java设计模式——单例模式的七种写法

    单例模式(Singleton) 单例模式(Singleton)是一种常用的设计模式.在Java应用中,单例模式能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频 ...

最新文章

  1. ubuntu安装OpenCV详细教程(建议收藏)
  2. 推荐收藏 | 算法工程师常见面试问题及相关资料汇总
  3. iOS开发网络——数据缓存
  4. 超级干货:关于数据中台的深度思考与总结
  5. phpAmin如何导入导出大数据文件?
  6. 典型关联分析CCA(canonical correlation analysis)
  7. idea 注释模板_常用的模板函数
  8. linux挂载光盘装ftp服务,linux ftp安装和配置
  9. hive 把mysql语句执行_Hive SQL 语句的执行顺序
  10. 街篮服务器维修时间,全新花式技能系统 《街头篮球》春节前夕版本上线
  11. ceoi2017 Building Bridges(build)
  12. 帆软报表Tomcat 发布部署
  13. mysql测评作业指导书_测评作业指导书
  14. 深大与南科大计算机,深圳大学和南方科技大学你选哪所?哪所实力更强?
  15. VMware: 虚拟机报错 ( 虚拟化性能计数器需要至少一个可正常使用的计数器, 模块 “VPMC“ 启动失败 , 未能启动虚拟机 )
  16. html 未读消息红点,消息未读之点不完的小红点(Node+Websocket)
  17. 中国AI觉醒 阿里王坚:云智能将成为大趋势
  18. 跪了!美团Android开发工程师岗位职能要求,重难点整理
  19. 如何将多个PDF文件合并为一个PDF,4种工具推荐,适用手机和PC
  20. K2 BPM介绍(1)

热门文章

  1. 用Nginx如何配置运行无扩展名PHP文件或非.PHP扩展名文件
  2. 利用正则表达式去掉html代码
  3. 深度学习的40种应用
  4. 港中大教授研发DeepID人脸识别技术 准确率超99%
  5. VS2010 LNK1123:转换到 COFF期间失败:文件无效或损坏”的解决方法
  6. MP4大文件虚拟HLS分片技术,避免服务器大量文件碎片
  7. Delphi中流对象 TStream
  8. 《Xcode实战开发》——1.2节参与计划
  9. 安装SQL2012 提示 setup account privileges Failed 解决办法
  10. 网页制作中的背景处理