单例模式:Java单例模式的几种写法及它们的优缺点
总结下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;
} }
优点:支持多线程,并发量高,且以懒汉式加载,不浪费内存空间。
缺点:一时找不出缺点,非要说缺点的话,就是实现比较麻烦。
单例模式:Java单例模式的几种写法及它们的优缺点的更多相关文章
- java多线程的3种写法
1.Thread /** * */ package testJava2.thread; /** * @author xxx.sjtu * @function * @date 2017年5月17日 * ...
- Java中单例七种写法(懒汉、恶汉、静态内部类、双重检验锁、枚举)
/*** * 懒汉模式 1 * 可以延迟加载,但线程不安全. * @author admin * */ public class TestSinleton1 { private static Test ...
- java enum的一种写法记录
public enum TestEnum { provider { @Override public void provide() { this.name = "hjzgg"; } ...
- 9种Java单例模式详解(推荐)
单例模式的特点 一个类只允许产生一个实例化对象. 单例类构造方法私有化,不允许外部创建对象. 单例类向外提供静态方法,调用方法返回内部创建的实例化对象. 懒汉式(线程不安全) 其主要表现在单例类在外 ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- java单例模式的几种写法比较
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- Java:单例模式的七种写法(转载)
第一种(懒汉,线程不安全): package Singleton; /** * @echo 2013-10-10 懒汉 线程不安全 */ public class Singleton1 { priva ...
- Java:单例模式的七种写法[转]
第一种(懒汉,线程不安全): 1 public class Singleton { 2 private static Singleton instance; 3 privat ...
- 【JAVA学习】单例模式的七种写法
尊重版权:http://cantellow.iteye.com/blog/838473 第一种(懒汉.线程不安全): Java代码 public class Singleton { private ...
随机推荐
- SVN提交错误及使用技巧
错误1: Some of selected resources were not added to version control. Some of selected resources were n ...
- Flink 使用(一)——从kafka中读取数据写入到HBASE中
1.前言 本文是在<如何计算实时热门商品>[1]一文上做的扩展,仅在功能上验证了利用Flink消费Kafka数据,把处理后的数据写入到HBase的流程,其具体性能未做调优.此外,文中并未就 ...
- HDU-4190-Number Sequence-容斥原理+多重集和的r组合
HDU-4190-Number Sequence-容斥原理+多重集和的r组合 [Problem Description] 给你\(n\)个数\(b_i\),问有多少个长度为\(n\)序列\(a_i\) ...
- machine learning (5)---learning rate
degugging:make sure gradient descent is working correctly cost function(J(θ)) of Number of iteration ...
- 解决Antimalware Service Executable CPU占用高的问题
windows8/8.1,WIN10自带的安全软件Windows defender还不错,基本可以不用装其他杀毒软件了. 但是其进程Antimalware Service Executable 出现C ...
- 初始SpringBoot
导入依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http:/ ...
- python - 使用psutils
oshelper.py #encoding=utf-8 import psutil import datetime #查看cpu的信息 print u"CPU 个数 %s"%psu ...
- js之大文件断点续传
文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...
- win32线程栈溢出问题 (二)
3.2.函数递归调用引发的栈溢出 写一段最简单的无穷递归代码,如下: #include "stdafx.h" void f(void) { f(); } int _tmain(in ...
- snmp-trap
snmpd作为一个服务,本身有系统的一些信息,外部可以通过snmp -get ,walk来获取,前提是被控主机开启了snmpd服务, snmptrap理解为一个陷阱,等着掉进来猎物,就是一个收数据的服 ...