单例模式:Java单例模式的几种写法及它们的优缺点
2024-08-23 00:28:27
总结下Java单例模式的几种写法:
1. 饿汉式
public class Singleton
{ private static Singleton instance = new Singleton(); private Singleton() {} public static Singleton getInstance() {
return instance;
} }
优点:实现简单,不存在多线程问题,直接声明一个私有对象,然后对外提供一个获取对象的方法。
缺点:class 类在被加载的时候创建Singleton实例,如果对象创建后一直没有使用,则会浪费很大的内存空间,此方法不适合创建大对象。
2. 懒汉式(线程不安全)
public class Singleton
{ private static Singleton instance = null; private Singleton() {} public static Singleton getInstance() { if (instance == null) {
instance = new Singleton();
}
return instance;
} }
优点:节省内存空间,在使用的时候才会创建;
缺点:在多线程下,可能会创建多个实例(一定要重视这个问题,有时候如果在单例对象的构造方法中做了某些重要操作,创建多个实例可能会造成可怕后果,如:打开Android的Sqlite数据库连接)。
3. 懒汉式(线程安全)
public class Singleton
{ private static Singleton instance = null; private Singleton() {} public synchronized static Singleton getInstance() { if (instance == null) {
instance = new Singleton();
}
return instance;
} }
优点:支持多线程,且以懒汉式的方式加载,不浪费内存空间。
缺点:将 synchronized 块加在方法上,会影响并发量,每次调用getInstance()方法都会线程同步,效率十分低下。最重要的是,当创建好实例对象之后,就不必继续进行同步了。
4.懒汉式(线程安全,推荐)
public class Singleton
{ private static volatile Singleton instance = null; private Singleton() {} public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
} }
优点:支持多线程,并发量高,且以懒汉式加载,不浪费内存空间。
缺点:一时找不出缺点,非要说缺点的话,就是实现比较麻烦。
最新文章
- Map工具系列-07-TFS变更集提取工具
- C#中的LINQ
- saltstack命令执行过程
- VM虚拟机下安装Centos7.0图文教程
- Android studio 签名使用转
- lintcode:将二叉树拆成链表
- 在使用<;script>;嵌入JavaScript代码时,不要在代码中的任何地方出现";<;/script>;";字符串
- [NOIP2014][DP]飞扬的小鸟
- JS框架设计读书笔记之-异步
- [POI2000]病毒
- 论文笔记:Auto-DeepLab: Hierarchical Neural Architecture Search for Semantic Image Segmentation
- Beta冲刺 4
- HTML一片空白, 无法渲染: Empty tag doesn&#39;t work in some browsers
- web前端(13)—— 了解JavaScript,JavaScript的引入方式
- linux 学习笔记 tail 命令
- [转]MyBatis动态传入表名、字段名参数的解决办法
- 知识点:Mysql 基本用法之事务
- 1.6getId()方法
- PowerBuilder编程新思维5:包装(界面美化与WebUI+React)
- pyspark dataframe 常用操作