饿汉式:类初始化是不管你需不需要直接创建对象,不存在线程安全问题
直接创建Singleton.java

public class Singleton {public final static Singleton INSTANCE = new Singleton();/*** 构造器私有*/private Singleton(){}
}

枚举Singleton.java

/*** 枚举式* 该类型对象是有限的几个,可以限定为一个,那么就是单例了。*/
public enum  Singleton2 {INSTANCE
}

静态代码块Singleton.java

/*** 静态代码块*/
public class Singleton3 {public final static Singleton3 INSTANCE;static{INSTANCE = new Singleton3();}private Singleton3(){}
}

懒汉式:延迟创建实例对象;存在线程安全问题。

线程不安全:Singleton4.java

public class Singleton4 {//设置成private,怕类一调用:如果没创建对象,则是空的。private static Singleton4 instance;//构造器私有话private Singleton4(){}public static Singleton4 getInstance() throws InterruptedException {//判断是否创建,没创建直接创建,创建后直接返回if(instance==null){Thread.sleep(2000);instance  = new Singleton4();}return instance;}
}

线程安全:Singleton5.java适用于多线程
Singleton4.java的基础上修改

 public static Singleton5 getInstance() throws InterruptedException {synchronized (Singleton5.class){//判断是否创建,没创建直接创建,创建后直接返回if(instance==null){Thread.sleep(2000);instance  = new Singleton5();}}return instance;}

以上并不是最优的,以上在第一个线程完成创建之后instance已经部位空。第二个线程可以直接获得,并不用再获得锁。
所以优化后的为

public class Singleton5 {//设置成private,怕类一调用:如果没创建对象,则是空的。private static Singleton5 instance;//构造器私有话private Singleton5(){}public static Singleton5 getInstance() throws InterruptedException {if(instance==null){synchronized (Singleton5.class){//判断是否创建,没创建直接创建,创建后直接返回if(instance==null){Thread.sleep(2000);instance  = new Singleton5();}}}return instance;}
}

以上两个的测试方式:

public class TestSingleton {public static void main(String[] args) throws ExecutionException, InterruptedException {/*Singleton4 singleton4 = Singleton4.getInstance();System.out.println(singleton4);*/Callable<Singleton4> callable = new Callable<Singleton4>() {@Overridepublic Singleton4 call() throws Exception {return Singleton4.getInstance();}};ExecutorService es = Executors.newFixedThreadPool(2);Future<Singleton4> submit1 = es.submit(callable);Future<Singleton4> submit2 = es.submit(callable);Singleton4 s1 = submit1.get();Singleton4 s2 = submit2.get();System.out.println(s1==s2);System.out.println(s1);System.out.println(s2);es.shutdown();}
}

静态内部类(适用于多线程)Singleton6 .java

/*** 在内部类被加载和初始化时创建对象*/
public class Singleton6 {private Singleton6(){}private static class inner{private static Singleton6 instance = new Singleton6();}public Singleton6 getSingleton(){return inner.instance;}
}

总结:
饿汉式:枚举类最简单
懒汉式:静态内部类形式最简单

单例设计模式,写出几个例子相关推荐

  1. 分析JDK中的Runtime的单例设计模式以及使用小例子

    package july.star.thread23;import java.io.IOException;/*** RunTime * JDK中的一个单例设计模式* @author MoXingJi ...

  2. Java设计模式—单例设计模式(Singleton Pattern)完全解析

    转载请注明出处:http://blog.csdn.net/dmk877/article/details/50311791 相信大家都知道设计模式,听的最多的也应该是单例设计模式,这种模式也是在开发中用 ...

  3. java 单例内部类_9 java的关键字static、单例设计模式、初始化块、关键字final、抽象类、接口、内部类...

    static关键字 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new关键字才会产生出对象,这时系统才会分配内存空间给对象,其方法才可以供外部调用.我们有时 ...

  4. Java查漏补缺(08)关键字:static、单例设计模式、理解main方法、类的成员之四:代码块、final关键字、抽象类、接口、内部类、枚举类、注解、包装类

    Java查漏补缺(08)关键字:static.单例设计模式.理解main方法.类的成员之四:代码块.final关键字.抽象类.接口.内部类.枚举类.注解.包装类 本章专题与脉络 1. 关键字:stat ...

  5. 笔记:Java中的单例设计模式

    之前接触过单例模式,当初不明白这样的设计用意,今天特地研究了下java中的单例设计模式的用处及用法. 单例模式:单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.一个类 ...

  6. 设计延迟加载的“单例设计模式”

    今天看毕老师的线程部分,学到了如何设计延迟加载的单例设计模式: 单例设计模式分两种: 1.饿汉模式 2.懒汉模式 先上饿汉式代码: // 饿汉式 class Single{ private stati ...

  7. export function函数传参_04 js高阶函数(惰性函数、柯里化函数、compose函数)和单例设计模式...

    高阶函数的定义 在<javascript设计模式和开发实践>中是这样定义的. 函数可以作为参数被传递: 函数可以作为返回值输出. 结合这两个特点,首先想到的肯定是回调函数,回调函数也是高阶 ...

  8. 【秒懂设计模式】单例设计模式

     秒懂设计模式--单例设计模式 (三)单例设计模式 1.先解释一下,什么是单例模式呢? 在Java中是这样定义的:"一个类有且仅有一个实例,并且自行实例化向整个系统提供." 显然从 ...

  9. jdk8新特性(接口新特性、lambda表达式、方法引用、函数式接口、Stream流)和单例设计模式

    1.单例设计模式 1.概念: 设计模式:使用固有的流程或方式设计出来的类接口.枚举等元素 2.设计原则: 1.私有化构造方法[private.protected] 2.类中创建最终对象[唯一不能被赋值 ...

  10. 单例设计模式共享数据分析、解决,call_once

    一.设计模式大概谈 "设计模式":代码的一些写法,与常规的写法不太一样,程序灵活,维护起来很方便,但是别人接管.阅读代码很痛苦. 用"设计模式"理念写出来的代码 ...

最新文章

  1. Caffe源码中各种依赖库的作用及简单使用
  2. python pip在哪里_Python 2.7.9(Linux)中的pip在哪里
  3. 新手如何快速上手Linux,韦东山告诉你。
  4. JFrog Artifactory 7.27 上传应用到私服和从maven私服下载制品
  5. Url几个常用的函数
  6. Applying Multicycle Exceptions in the TimeQuest Timing Analyzer--Altera Note
  7. Python_目录的简单操作(新建/查看/删除)
  8. linux信号及其含义
  9. linux 内核udp编程,Linux下网络编程实现UDP,还有大量实例
  10. IOS底层数据结构--class
  11. PHP获取grpc请求时间,Go gRPC进阶-超时设置(六)
  12. 阿里云 POSTFIX 邮件服务 PHP
  13. 【入门书籍】新手入门机器学习,强烈推荐这几本书籍
  14. 两矩阵相乘的秩的性质_矩阵分析与应用(一,矩阵基础知识)
  15. web项目报404一直找不到图片(路径绝对正确)
  16. 微信小程序获取手机号php
  17. 李白:下终南山过斛斯山人宿置酒
  18. 网络邻居中打不开计算机,怎么解决Win7 64位旗舰版系统中网上邻居打不开
  19. C# 委托代理动态的方法
  20. 如何将 Django 服务器单独部署到 heroku 上

热门文章

  1. 苹果手机怎么设置信号服务器,苹果手机信号怎么改成数字 方法介绍
  2. tm影像辐射定标_Landsat-TM-辐射定标和大气校正步骤
  3. nps内网端口映射,含(p2p配置方法)
  4. 《算法导论3rd第十二章》二叉查找树
  5. MES工程师新手,该怎么学习?学习哪些技术?
  6. 游戏经济系统——体系设计
  7. 计算机考研专业课资料百度云,考研专业课资料(一)
  8. 计算机限制无法压缩,电脑上文件夹压缩不了怎么办
  9. php仿携程网站,三分钟带你仿携程飞机票首页炫酷交互
  10. SimpleDateFormat 使用TimeZone