说句实话, 这个问题把我问的一脸懵逼, 怎么会有这种面试题? 你如果问我双重检查锁的单利模式实现的利弊, 还ok, 第一次碰到, 网上百度下 , 真TMD有, 现在贴出来跟大家分享, 尤其注意 双重检查锁的单利模式就好了!
需要确保某个类只要一个对象,或创建一个类需要消耗的资源过多,如访问IO和数据库操作等,这时就需要考虑使用单例模式了。
使用单例模式需要注意的关键点
- 将构造函数访问修饰符设置为private
- 通过一个静态方法或者枚举返回单例类对象
- 确保单例类的对象有且只有一个,特别是在多线程环境下
- 确保单例类对象在反序列化时不会重新构建对象
单例模式的几种写法
1. 饿汉式
/**
* 饿汉式实现单例模式
*/
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
2. 懒汉式
/**
* 懒汉式实现单例模式
*/
public class Singleton {
private static Singleton instance;
private Singleton() {
}
// synchronized方法,多线程情况下保证单例对象唯一
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
getInstance()方法中添加了synchronized关键字,使其变成一个同步方法,目的是为了在多线程环境下保证单例对象唯一。
优点: 只有在使用时才会实例化单例,一定程度上节约了资源。
缺点: 第一次加载时要立即实例化,反应稍慢。每次调用getInstance()方法都会进行同步,这样会消耗不必要的资源。这种模式一般不建议使用。
3. DCL(Double CheckLock)实现单例
/**
* DCL实现单例模式
*/
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
// 两层判空,第一层是为了避免不必要的同步
// 第二层是为了在null的情况下创建实例
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
优点: 资源利用率高,既能够在需要的时候才初始化实例,又能保证线程安全,同时调用getInstance()方法不进行同步锁,效率高。
缺点: 第一次加载时稍慢,由于Java内存模型的原因偶尔会失败。在高并发环境下也有一定的缺陷,虽然发生概率很小。
DCL模式是使用最多的单例模式实现方式,除非代码在并发场景比较复杂或者JDK 6以下版本使用,否则,这种方式基本都能满足需求。
4. 静态内部类
/**
* 静态内部类实现单例模式
*/
public class Singleton {
private Singleton() {
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
/**
* 静态内部类
*/
private static class SingletonHolder {
private static Singleton instance = new Singleton();
}
}
第一次加载Singleton类时不会初始化instance,只有在第一次调用getInstance()方法时,虚拟机会加载SingletonHolder类,初始化instance。
这种方式既保证线程安全,单例对象的唯一,也延迟了单例的初始化,推荐使用这种方式来实现单例模式。
5. 枚举单例
/**
* 枚举实现单例模式
*/
public enum SingletonEnum {
INSTANCE;
public void doSomething() {
System.out.println("do something");
}
}
默认枚举实例的创建是线程安全的,即使反序列化也不会生成新的实例,任何情况下都是一个单例。
相关推荐
在Java语言中,实现单例模式主要有以下几种方式: 1. 饿汉式(Eager Initialization) 饿汉式单例模式在类加载的时候就已经进行了实例化,因此它不需要考虑多线程同步的问题。这种方式在类加载时就完成了初始化,...
在具体实现上,单例模式通常有几种常见的构造方式: 1. 饿汉式:在类加载时就完成实例化,避免了线程同步问题,但可能会造成不必要的内存浪费。 2. 懒汉式:只有在第一次调用getInstance()时才创建实例,但在多线程...
在Java面试中,设计模式是衡量开发者能力的重要标准,因为它们能够提高代码的可读性、可维护性和复用性。以下是根据提供的内容对几种常见设计模式的详细说明: 1. **Singleton(单例模式)**: - 单例模式确保一个...
* XML稳当定义的几种形式,它们之间的区别 五、J2EE、MVC方面 * MVC的各部分由哪些技术实现 * 为什么要分层 * 模式的相关知识,如单例工厂模式等 * 乱码的处理 * 一次请求的处理过程 六、数据库方面 * 存储过程...
在Java开发领域,设计模式是面试中不可或缺的一...理解并能够灵活运用这些模式,对于在Java面试中脱颖而出至关重要。同时,理解设计模式的意图、优缺点以及适用场景,也是评判一个开发者是否具备高级技能的重要标志。
在《Java设计模式(疯狂Java联盟版).chm》中,你将了解到23种经典的GOF设计模式,包括创建型模式(如单例模式、工厂模式、抽象工厂模式)、结构型模式(如代理模式、适配器模式、装饰器模式)、行为型模式(如观察...
- **单例模式**:学习几种常见的单例实现方式,如饿汉式、懒汉式、双重检查锁定等。 - **工厂模式**:理解简单工厂、工厂方法、抽象工厂模式的应用场景。 - **装饰器模式**:知道如何在不修改原有代码的基础上...
【Java面试之——代码与编程题】是Java程序员在求职过程中常常遇到的面试环节,主要考察应聘者对Java语言的理解和实际操作能力。面试中,面试官可能会提出各种类型的编程题目,包括但不限于设计模式、继承机制、内部...
在Java面试中,面试官通常会考察候选人的基础知识、编程能力、设计模式理解、并发处理、内存管理以及对JVM(Java虚拟机)的了解。香港的JAVA程序员面试笔试题目可能涵盖以下几个关键领域: 1. **基础语法**:面试...
在Java面试中,设计模式部分常常会涉及以下几个重点: 1. **单例模式**:确保一个类只有一个实例,并提供一个全局访问点。面试时可能会问到如何实现线程安全的单例,如双重检查锁定(DCL)和枚举单例。 2. **工厂...
通常,单例模式通过以下几种方式实现线程安全性: 1. **饿汉式(预加载)**:在类加载时就创建实例。 2. **懒汉式(延迟加载)**:在首次使用时创建实例。 3. **双重检查锁定**:结合懒汉式的延迟加载与同步机制。 ...
创建型模式有五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式有七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式有十一种:策略模式、...
熟悉常用的几种设计模式,如工厂模式、单例模式、观察者模式等;在数据库方面,SQL语句的优化,事务管理,以及JDBC操作等都会被考察;而JVM调优涉及类加载机制、内存分配策略、垃圾收集器的选择等。 最后,对于Java...
单例模式、工厂模式、观察者模式、装饰器模式、代理模式、适配器模式等。 十一、Spring框架 13. Spring框架的核心功能是什么? Spring提供依赖注入(DI)、面向切面编程(AOP)、容器管理、数据访问/集成、Web框架...
熟练掌握几种常用的设计模式是体现开发者经验的重要标志。 数据库操作方面,SQL语言的熟练掌握,事务处理、索引、JOIN操作、存储过程等都是面试中常见的问题。 最后,对于企业级应用,Spring框架的使用越来越普遍...
Java面试宝典是Java开发者在求职过程中不可或缺的参考资料,它涵盖了Java编程语言的基础知识、进阶概念以及实际应用。这份面试宝典旨在帮助求职者全面准备Java相关的面试问题,提高成功获得理想职位的机会。 首先,...
在Java面试中,以下几个知识点是常见的考察点: 1. **基础概念**: - **类与对象**:Java是一种面向对象的语言,类是对象的蓝图,对象是类的实例。理解类的定义、构造器、成员变量和方法是至关重要的。 - **封装*...
- **单例模式**:理解单例模式的设计思想,掌握其实现方法(懒汉式、饿汉式、枚举式等)。 - **工厂模式**:了解工厂模式的定义及分类(简单工厂、工厂方法、抽象工厂),并能应用于实际项目中。 - **观察者模式**:...
- **工厂方法模式**:定义一个创建对象的接口,由子类决定实例化哪一个类,使得类的实例化推迟到子类。 - **抽象工厂模式**:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。 **知识点3:...