还记得很多年前,面试就让在白板上写个单例模式,当时技术渣渣,还写的是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. Codeforces 35E Parade 扫描线 + list

    主题链接:点击打开链接 意甲冠军:特定n矩阵(总是接近底部x轴) 然后找到由上面的矩阵所包围的路径,的点 给定n 以下n行给定 y [x1, x2] 表示矩阵的高度和2个x轴坐标 思路: 扫描线维护每 ...

  2. 【iOS发展-89】UIGestureRecognizer完整的旋转手势识别、缩放和拖拽等效果

    (1)效果 (2)代码 http://download.csdn.net/detail/wsb200514/8261001 (3)总结 --先依据所需创建不同类型的手势识别.比方: UITapGest ...

  3. 2019 renew 博客目录

    .net && .net core Microsoft.AspNet.SignalR实现弹幕(即时通讯) C#调用JS httpclient POST请求(urlencoded) 二维 ...

  4. asp .net mvc 获得用户IP

    string strHostName = System.Net.Dns.GetHostName(); //clientIPAddress是一个数组,可能有多个数据 var clientIPAddres ...

  5. 专访Jeffrey Richter:Windows 8是微软的重中之重

    Jeffrey Richter 以其多本 Windows 核心技术的经典著作而闻名,同时,他深入掌握微软的 .NET 等一系列核心技术,他所创办的 Wintellect 公司与微软有密切的合作关系,他 ...

  6. jquery 相对元素

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  7. glibc_error reporting

    很多GNU C库里的函数都会侦测并报告错误条件.我们的程序需要检测这些错误条件.比如:我们打开一个输入文件时需要判断该文件是否正确的打开.如果没有正确打开,我们需要打印错误或者采取其他正确的方式.为了 ...

  8. C++的中英文字符串表示(string,wstring),使用wcout.imbue(std::locale("chs"));本地化解析编码

    在C++中字符串类的string的模板原型是basic_string template <class _Elem, class traits = char_traits<_Elem> ...

  9. 通过 vuex 实现 vue-echarts 图表的手动 resize

    背景:项目有用到 vue-echarts, 百度推出的 vue 版本的 Echarts,图表自带响应式属性 auto-resize, 来实现窗口尺寸变化时,图表的尺寸自适应,但是发现它是靠监听 win ...

  10. C# 多进程安全

    多个应用程序同时写入数据到一个文件中时可用 public void WriteData(string dataWh, string filePath) { EventWaitHandle waitHa ...