还记得很多年前,面试就让在白板上写个单例模式,当时技术渣渣,还写的是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. WPF生命周期

    App.xaml.cs         重写OnStartup方法,完成初始化 wpf中Window的生命周期    

  2. XF 进度条和指示器

    <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http:/ ...

  3. Linux ssh密钥自动登录 专题

    在开发中,经常需要从一台主机ssh登陆到另一台主机去,每次都需要输一次login/Password,很繁琐.使用密钥登陆就可以不用输入用户名和密码了 实现从主机A免密码登陆到主机B(即把主机A的pub ...

  4. C# WinForm TreeView选择父节点子节点全选

    //设置标志,防止死循环 bool check = false; public void TV_AfterCheck(object sender, TreeViewEventArgs e) { if ...

  5. Index of /android/repository

    放这里了,总是记不住... https://mirrors.zzu.edu.cn/android/repository/

  6. WPF使用WindowChrome实现自定义标题框功能

    代码: <Window x:Class="WpfDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx ...

  7. UWP入门(二) -- 基础笔记

    原文:UWP入门(二) -- 基础笔记 不错的UWP入门视频,1092417123,欢迎交流 UWP-04 - What i XMAL? XAML - XML Syntax(语法) ,create i ...

  8. 使用Chart控件进行实时监控

    Chart作为微软提供绘制图表的控件,在刚开始使用时非常的迷茫,因为功能强大,涉及到的知识多, 一开始难以接收过来,但后天经过查找资料,耐心学习,终于还是有了一定的收获. Chart相当于一个大的图纸 ...

  9. Tensorflow进阶

    第一章 图像领域,第\(i\)类图片提取到的特征: \[ feature_i=\sum_jw_{i,j}x_j+b_i \] 其中,\(j\)表示一张图片的第\(j\)个像素,\(b_i\)是偏置值( ...

  10. Delphi结束进程模块

    function KillTask(ExeFileName: string): integer; const PROCESS_TERMINATE = $0001; var ContinueLoop: ...