手写一个单例模式是 Java 面试中常见的问题,很多时候我们更偏向于简单的写一个饿汉或饱汉模式,深入研究的甚少,这里列举三种实现方式,并对各自的优缺进行分析。

1. 饿汉式

public class Singleton {
private Singleton(){}
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}

  这种方式要求类在加载时就要实例化,所以程序开始时就可能产生许多暂时没有不会用到的实例,减缓了程序初始化过程。但它写法简便,线程安全,是完成相关题目时的首选,同时这也是部分 IDE 工具在自动创建单例的时候默认采用的写法。

2. 饱汉式

public class Singleton {
private Singleton(){}
private static Singleton instance;
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}

  首次获取该类实例时才进行实例化,符合程序设计要求,同时结构还算清晰,一般也能准确编写。但这种实现方式本身线程不安全,需要用 synchronized 关键字做方法同步。

3.双重锁式

publc class Singleton {
private Singleton(){}
private volatile static Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
synchronized(Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}

  其实这种方式可以看作是饱汉模式的一种改进,主要考虑到同步是一种高开销的操作,应该尽量减少同步的内容,所以这里在获取实例的静态方法里面做了代码块同步,不再像之前,每次启用 getInstance 方法获取实例时,不管实例是否已经存在都会对后续操作进行同步处理。这里先对实例是否存在进行判断,当确实例不存在确实需要进行实例化操作时再做后续操作,而在入同步代码块前一刻始终有可能另一个线程已经对其完成了实例化,所以还要再做第二次判断,volatile 能保证各线程对 instance 进行操作时的可见性,即保证每次进行判断时 instance 的值都是最新的。

Java 代码编写单例模式总结的更多相关文章

  1. Java代码编写规范(不是标准规范,自行整理,无须纠结)

    最近回过头来给以前的项目增加功能,发现之前写的注释非常不全,代码也非常的不整洁,有些地方写的''窝七八烂的,看着很不舒服:又恰好经理最近也经常跟我提起代码规范,我们就讨论了一下代码规范的重要性和必要性 ...

  2. Java代码编写的一般性指导

    (1) 命名规则:这个最基本,也最重要,请牢记. 1,类名首字母应该大写. 2,字段.方法以及对象(句柄)的首字母应小写. 3,对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字 ...

  3. Java学习---Java代码编写规范

    编码规范 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的编程风格,兹制定下述Java编程规范,以规范系统Java部分编程.系统继承的其它资源中的源程序也应按此规 ...

  4. Java代码编写规范(转载)

    编码规范 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的编程风格,兹制定下述Java编程规范,以规范系统Java部分编程.系统继承的其它资源中的源程序也应按此规 ...

  5. Java代码编写、代码优化技巧总结

    随着工作经验的积累,在代码编写和优化方面,个人的心得体会总结以及有些从网上或书本中看到的有用技巧 1. 判断何时使用keySet()和entrySet() 获取Map 的key 和value 当循环中 ...

  6. Java代码编写的30条建议

    1) 类名首字母应该大写.字段.方法以及对象(句柄)的首字母应小写.对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母.例如: ThisIsAClassName thisIsM ...

  7. 大数据之路week07--day03(Hadoop深入理解,JAVA代码编写WordCount程序,以及扩展升级)

    什么是MapReduce 你想数出一摞牌中有多少张黑桃.直观方式是一张一张检查并且数出有多少张是黑桃. MapReduce方法则是: 1.给在座的所有玩家中分配这摞牌 2.让每个玩家数自己手中的牌有几 ...

  8. 高质量JAVA代码编写规范

    1. Java 命名约定 除了以下几个特例之外,命名时应始终采用完整的英文描述符.此外,一般应采用小写字母,但类名.接口名以及任何非初始单词的第一个字母要大写. 1.1 一般概念 * 尽量使用完整的英 ...

  9. Java代码实现单例模式

    public class Single { /*private static final Single single=new Single(); private Single(){} public s ...

随机推荐

  1. SHELL字符串处理技巧(${}、##、%%)

      在SHELL编程中,经常要处理一些字符串变量.比如,计算长度啊.截取子串啊.字符替换啊等等,常常要用到awk.expr.sed.tr等命令.下面给大家介绍个简单的字符串处理方法,用不着嵌套复杂的子 ...

  2. Android面试题 请解释下单线程模型中Message、Handler、MessageQueue、Looper之间的关系

    简单的说,Handler获取当前线程中的looper对象,looper用来存放从MessageQueue中取出的Message,再由Handler进行Message分发和处理,按照先进先出执行. Me ...

  3. AD 复制状态检查

      微软提供了一下工具进行AD复制状态检查 Repadmin: http://technet.microsoft.com/en-us/library/cc811551%28v=ws.10%29.asp ...

  4. SegNet网络的Pytorch实现

    1.文章原文地址 SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation 2.文章摘要 语义分 ...

  5. unable to access 'https://github.com/shixianqing/img.git/': SSL connect error 解决办法

    解决在linux环境下,git clone 项目,走https协议时,报SSL connect error 错误 升级nss yum update -y nss curl libcurl

  6. js 异步执行顺序

    参考文章: js 异步执行顺序   1.js的执行顺序,先同步后异步 2.异步中任务队列的执行顺序: 先微任务microtask队列,再宏任务macrotask队列 3.调用Promise 中的res ...

  7. super关键字小结(构造方法的执行是不是一定会创建对象?)

    1.父类 public class Person { private String name = "李四"; private int age; public Person() { ...

  8. 使用itchat进行自动微信聊天

    import itchat def we_chat(message): #enableCmdQR=2用于linux中显示二维码,hotReload=True退出程序后暂存登录状态 itchat.aut ...

  9. 前端面试题-JavaScript

    引用GitHub 上 ltadpoles的前端面试 https://github.com/ltadpoles 目录  1. JavaScript 有哪些数据类型  2. 怎么判断不同的JS数据类型   ...

  10. Vue项目中v-bind动态绑定src路径不成功

    问题: 在做Vue项目的时候,由于项目需求,需要动态绑定img的src时,突然发现如果说是直接请求后台接口的图片地址就能显示, 但是直接动态绑定img的src的图片的相对路径或者是绝对路径的时候,图片 ...