还记得很多年前,面试就让在白板上写个单例模式,当时技术渣渣,还写的是class A.面试官还说,你就不能写个Singleton.

面试题

  • 编程题:写一个Singleton示例

解析

什么是Singleton?

  • Singleton: 就是指的java中的单例设计模式
  • 单例模式:即某个类在整个系统中只有一个实例对象可被获取和使用的代码模式

单例模式的特点

  • 单例类只能有一个实例。

    • 构造函数私有化
  • 单例类必须自己创建自己的唯一实例。
    • 含有一个该类的静态变量来保存这个唯一实例
  • 单例类必须给所有其他对象提供这一实例。
    • 对外提供获取该实例对象的方式

单例模式常见的形式

  • 饿汉式:直接创建对象,不存在线程安全的问题

    • 直接实例化饿汉式(简洁直观)
    • 枚举式(最简洁)
    • 静态代码块饿汉式(适合复杂实例化)
  • 懒汉式:延迟创建对象
    • 线程不安全 (适合单线程)
    • 线程安全(适合多线程)
    • 静态内部类形式(适合多线程)

代码实战

饿汉式

(1) 直接实例化饿汉式

/**
* 饿汉式(直接创建实例对象)
* 直接通过类名调用
*
* @author kevin
* @date 2019/7/8 11:23
*/
public class Singleton1 {
public static final Singleton1 INSTANCE = new Singleton1(); private Singleton1() { }
}

(2)枚举式

/**
* 饿汉式(枚举)
*
* @author kevin
* @date 2019/7/8 11:29
*/
public enum Singleton2 {
INSTANCE;
}

(3) 静态代码块

import java.io.IOException;
import java.util.Properties; /**
* @author kevin
* @date 2019/7/8 13:35
*/
public class Singleton3 { public static final Singleton3 INSTANCE;
private String info; static {
try {
Properties properties = new Properties();
properties.load(Singleton3.class.getClassLoader().getResourceAsStream("sing.properties"));
INSTANCE = new Singleton3(properties.getProperty("info"));
} catch (IOException e) {
throw new RuntimeException(e);
} } private Singleton3(String info) {
this.info = info;
} public String getInfo() {
return info;
} public void setInfo(String info) {
this.info = info;
} @Override
public String toString() {
return "Singleton3{" +
"info='" + info + '\'' +
'}';
}
}

注意:这里还有个properties文件

info=kevin

测试

 Singleton3 s = Singleton3.INSTANCE;
System.out.println(s);

结果

 Singleton3{info='kevin'}

懒汉式

(1)线程不安全

public class Singleton4 {

    private static Singleton4 instance;

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

(2) 线程安全

/**
* @author kevin
* @date 2019/7/8 13:56
*/
public class Singleton5 { private static Singleton5 instance; public static Singleton5 getInstance() {
if (instance == null) {
synchronized (Singleton5.class) {
if (instance == null) {
instance = new Singleton5();
}
}
} return instance;
} private Singleton5() { }
}

(3)静态内部类 线程安全

/**
* 静态内部类不会自动随着外部类的加载而初始化
*
* @author kevin
* @date 2019/7/8 13:56
*/
public class Singleton6 {
private static class Inner {
private static final Singleton6 INSTANCE = new Singleton6();
} public static Singleton6 getInstance() {
return Inner.INSTANCE;
} private Singleton6() { }
}

注意:静态内部类不会自动随着外部类的加载而初始化

总结

  • 饿汉式,枚举最简单
  • 懒汉式,静态内部类最简单

好了,玩的开心。

02_javaSE面试题:单例设计模式的更多相关文章

  1. Java高频面试题--单例设计模式

  2. 适配器、工厂模式、线程池、线程组、互斥锁、Timer类、Runtime类、单例设计模式(二十四)

    1.多线程方法 * Thread 里面的俩个方法* 1.yield让出CPU,又称为礼让线程* 2.setPriority()设置线程的优先级 * 优先级最大是10,Thread.MAX_PRIORI ...

  3. Java单例设计模式和多例设计模式

    单例设计模型 教学视频链接:https://edu.aliyun.com/course/1011 1,private不可以在类外部访问,但可以在内部访问 2,此时Singleton类内部的instan ...

  4. 菜鸡的Java笔记 第二十九 - java 单例设计模式

    SingleCase 单例设计模式        1.单例设计模式的特点        2.多例设计模式的特点    内容    单例设计模式        现在如果说有这么一个程序类 class S ...

  5. 【iOS 单例设计模式】底层解析与运用

    [iOS 单例设计模式]底层解析与运用 一.单例设计名词解释: (官方解释)单例模式确保一个类只有一个实例,自行提供这个实例并向整个系统提供这个实例.(形象比喻)程序 — 公司   单例实例 - 管理 ...

  6. 单例设计模式全局缓存accessToken

    使用微信JS-SDK开发的小伙伴们,看文档经常会看到这样一句话:(下面是微信开发文档的一部分原话截图) 这句话就是:开发者必须在自己的服务全局缓存access_token,jsapi_ticket 下 ...

  7. java 单例设计模式

    1.饿汉单例设计模式:  步骤 :   1.定义一个私有的静态成员变量来引用对象(私有的静态对象),设置对象唯一.   2.私有化构造方法,防止new对象.   3.创建一个公开的静态方法,返回上面的 ...

  8. iOS开发之单例设计模式(完整正确版本)

    单例的意思从字面上就可以略知一二,所谓单例就是确保在程序运行过程中只创建一个对象实例.可以用于需要被多次广泛或者说多次使用的资源中,比如我们常见的网络请求类.工具类以及其它管理类等.比如我iOS开发中 ...

  9. GOF设计模式之1:单例设计模式

    1.单例设计模式核心作用: 保证一个类只有一个实例,并且提供了访问该实例的全局访问点 2.常见应用场景: window的任务管理器 项目中读取配置文件一般也是一个单例模式 数据库连接池的设计也是采用单 ...

随机推荐

  1. 目标检测的图像特征提取(一)HOG特点

    1.HOG特点: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检測的特征描写叙述子.它通过计算和统计图像局部区 ...

  2. centos6.5安装apache2.x并更改默认80port

    因为现在nginx它已成为反向代理软件的主流.因此,linuxserver在系统.我们几乎总是安装nginx东方的,这使在同一时间使用apache带来了麻烦.因为apache它用于通过缺省80port ...

  3. 傻瓜突破linux--rootpassword

    破password该方法: 方法1.单用户模式改动 (表示进入到单用户模式) ,按回车键,按b键启动.进入单用户模式.进行password改动,重新启动 init 5 口诀:e2e 空格1 回车b 开 ...

  4. 逻辑回归原理介绍及Matlab实现

    原文:逻辑回归原理介绍及Matlab实现 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/laobai1015/article/details/781 ...

  5. android 玩愤怒的小鸟等游戏的时候全屏TP失败

    1.tp driver的tpd_down()和tpd_up()函数不需要进行报告id号码.自己主动顶级赛: 2.tpd_up()功能只需要报告BTN_TOUCH和mt_sync信息,其他信息未报告,如 ...

  6. 关于ajax入门案例

    $.ajax方法 1.url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. 2.type: 要求为String类型的参数,请求方式(post或get)默认为get.注意其他ht ...

  7. WPF VisualTreeHelper的使用

    <Window x:Class="MyWpf.MainWindow"        xmlns="http://schemas.microsoft.com/winf ...

  8. glibc内存管理方式

    程序员接触的内存空间和系统接触的物理内存空间是有所区别的.对于一般进程来讲,他面对的是一个线性虚拟内存空间:地址从0到最大值.每一个进程面对的虚拟内存空间都是一样的,都享有全部的内存地址.虚拟内存空间 ...

  9. 消息队列中点对点与发布订阅区别(good)

    背景知识 JMS一个在 Java标准化组织(JCP)内开发的标准(代号JSR 914).2001年6月25日,Java消息服务发布JMS 1.0.2b,2002年3月18日Java消息服务发布 1.1 ...

  10. MVC 异步调用

    @{    Layout = null;}<!DOCTYPE html><html><head>    <meta name="viewport&q ...