还记得很多年前,面试就让在白板上写个单例模式,当时技术渣渣,还写的是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. XenServer重置存储管理SR至Ext3

    Xenserver默认安装到本地磁盘,它是基于本地磁盘上Linux的LVM所管理,在xenserver创建为LVM Typer的本地SR,xenserver在LVM上不支持Thin Provision ...

  2. cocos2d-x 在XML分析和数据存储

    无意中起到一周中的游戏,哎,时间过得总是打得那么快时,. .. 于是今天决定看一下之前不怎么非常熟悉的XML;(之前做游戏时数据的储存用到过XML.但这块是还有一个同事在做,所以不怎么熟悉), 看了看 ...

  3. HQL链接查询

    和SQL查询一样,HQL也支持各种各样的连接查询,如内连接.外连接.我们知道在SQL中可通过join字句实现多表之间的连接查询.HQL同样提供了连接查询机制,还允许显示指定迫切内连接和迫切左外连接.H ...

  4. android反射组件 (一个)java 它们的定义annotation基础知识

    它们的定义annotation它由三部分组成: 它们的定义annotation.使用annotation班.annotation的处理方法. 一.自己定义annotation  元注解包含下面: 1) ...

  5. EF学习目录

    EF EF性能优化 EF延迟加载LazyLoading EF相关报错 EF 事务 Entity相互关系 Entity种类(动态代理) DbContext Entity States Code Firs ...

  6. JS 输入框为空的使用

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

  7. SyncML是一平台无关的信息同步标准协议集

    SyncML (Synchronization Markup Language)是一平台无关的信息同步标准协议集.分为SyncML数据传输协议(SyncML-DS)和SyncML设备管理协议(Sync ...

  8. wpf 换行符

    方法1: <TextBlock Text="第一行 第二行"/>文字中间加上: 就可以了.这个方法很有用,也可以用在ToolTip上:<ToolTip Width ...

  9. QTcpServer与QTcpSocket通讯

    TCP        TCP是一个基于流的协议.对于应用程序,数据表现为一个长长的流,而不是一个大大的平面文件.基于TCP的高层协议通常是基于行的或者基于块的.          ●.基于行的协议把数 ...

  10. SQLServer 可更新订阅数据冲突的一个原因

    原文:SQLServer 可更新订阅数据冲突的一个原因 可更新订阅为什么有冲突? 可更新订阅中,当升级增加一个字段时,通常在发布服务器的发布数据库中增加,对表增加字段后,发布自动同步到订阅数据库中(复 ...