面试题2:实现单例模式

题目要求:
设计一个类,只能生成该类的一个实例。

/**
* 单例模式
* 定义:指实现了特殊模式的类,该类仅能被实例化一次,产生唯一的一个对象
* 应用举例:windows的任务管理器,回收站,web应用的配置对象,spring中的bean默认也是单例
* 分类:饿汉式,懒汉式,双检锁,静态内部类,枚举
* 评价指标有:单例(必须),线程安全,延迟加载,防止反序列化产生新对象,防止反射攻击
* 实现方法的选择:一般情况下直接使用饿汉式就好了,要求延迟加载时倾向于用静态内部类,涉及到反序列化创建对象或反射问题最好选择枚举
*
* @since 2019年1月24日 下午2:35:36
* @author xuchao
*
*/
public class P2_Singleton { public static void main(String[] args) {
// 调用方式
Singleton1 singleton1 = Singleton1.getInstance();
Singleton2 singleton2 = Singleton2.getInstance();
Singleton3 singleton3 = Singleton3.getInstance();
Singleton4 singleton4 = Singleton4.getInstance();
}
} // 版本一:饿汉式
// 特点:线程安全;在类初始化执行到静态属性时就分配了资源,有资源浪费问题;
class Singleton1 {
// 1.将构造方法私有化,不允许外部直接创建对象
private Singleton1() {
}
// 2.创建类的唯一实例,使用private static修饰
private static Singleton1 instance = new Singleton1(); // 3.提供一个用于获取实例的方法,使用public static修饰
public static Singleton1 getInstance() {
return instance;
}
} // 版本二:懒汉式(非线程安全)
// 特点:在第一次调用获取实例方法时分配内存,实现了懒加载;非线程安全;
class Singleton2 {
private Singleton2() {
} private static Singleton2 instance; public static Singleton2 getInstance() {
if (instance == null) {
instance = new Singleton2();
}
return instance;
}
} // 版本三:懒汉式变种(synchronized同步方法,支持多线程)
// 特点:线程安全;synchronized而造成的阻塞致使效率低,而且很多的阻塞都是没必要的。
class Singleton3 {
private Singleton3() {
} private static Singleton3 instance; public static synchronized Singleton3 getInstance() {
if (instance == null) {
instance = new Singleton3();
}
return instance;
}
} // 版本四:懒汉式变种(synchronized同步块,支持多线程)
// 特点:写法不同,但与版本三有一样的问题
class Singleton4 {
private Singleton4() {
} private static Singleton4 instance; public static Singleton4 getInstance() { synchronized (Singleton4.class) {
if (instance == null) {
instance = new Singleton4();
}
}
return instance;
}
}

最新文章

  1. java程序 启动时参数
  2. JProfiler 8下载地址和注册码
  3. Angular.js入门教程
  4. 在 2017 年将会更加流行的 6 个 Web 开发趋势
  5. 在线快速生成 CSS Sptite 的网站
  6. 3D视觉差---原生js+css
  7. Linux主机在LNMP环境中同时运行多个PHP版本
  8. MyBatis里字段到枚举类型的转换/映射
  9. 转: seajs手册与文档之 -- 模块标识
  10. Android组件生命周期(一)
  11. ABAP 程序中退出操作
  12. Memcached在Linux环境下的使用详解
  13. XSS,CSRF,Cookie防劫持的处理
  14. 小P的金字塔
  15. js设置、读取、删除cookie
  16. Net-Snmp工具(学习SNMP的工具,开源项目)简单使用
  17. ClassOne__HomeWork
  18. redis.clients.jedis.exceptions.JedisException: Can connect to sentinel, but seems to be not monitored.
  19. 软件工程-XP方法十二个最佳实践
  20. Self-Attention与Transformer

热门文章

  1. WPF——TaskBarIconOverlay(任务栏图标叠加)
  2. 错误:“ResourceDictionary”根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序。请移除 MouseLeftButtonDown 事件的事件处理程序.
  3. Win10《芒果TV》更新v3.8.40青春版:优化推送策略、新增缓存清理
  4. 算法之--回溯法-迷宫问题【python实现】
  5. 搭建svn服务器&服务器客户端使用笔记
  6. window8 飘带与页面切换效果
  7. WebP 极限压缩及ios实现
  8. Python正则表达式基础指南
  9. 学习Java,容易被你忽略的小细节(3)
  10. vmware centos7虚拟机克隆系统如何修改网卡设置?