单例模式(懒汉、饿汉、同步锁、static、枚举)实现
使用前提:
需要频繁的进行创建和销毁的对象,创建对象时耗时过多或耗费资源过多
三要素:
- 1、构造方法私有化;
- 2、实例化的变量引用私有化;
- 3、获取实例的方法共有。
1.饿汉式单例
弊端:在类装载的时候就完成实例化
/**
* 饿汉式单例
*
* @author Wonder
* @history create Wonder 2018年10月24日 上午9:55:32
* @version 1.0
*/
public class Singleton1 {
private Singleton1() {
}// 1私有化构造 private final static Singleton1 singleton1 = new Singleton1();// 2实例化 public static Singleton1 getInstance() {// 3对外提供
return singleton1;
} }
2.懒汉式单例
弊端:多线程环境下会产生多个single对象,线程不安全
/**
* 懒汉式单例
* 多线程环境下会产生多个single对象
*
* @author Wonder
* @history create Wonder 2018年10月24日 上午10:17:59
* @version 1.0
*/
public class Singleton2 {
private Singleton2() {
}// 1私有化构造 private static Singleton2 singleton2 = null;// 延迟实例 public static Singleton2 getInstance() {
if (singleton2 == null) {
singleton2 = new Singleton2();
}
return singleton2;
}
}
3.懒汉式单例(synchronized同步锁)
弊端:效率低
同步方法的方式:获取实例时,每次都要执行同步方法,效率太低
同步代码块的方式:可能多个线程同时进入if判断,实际页无法起到线程同步的作用
/**
* 懒汉式单例 只对需要锁的代码部分加锁
*
* @author Wonder
* @history create Wonder 2018年10月24日 上午10:17:59
* @version 1.0
*/
public class Singleton4 {
private Singleton4() {
}// 1私有化构造 private static Singleton4 single = null;// 延迟实例 public static Singleton4 getInstance() {
if (single == null) {
synchronized (Singleton4.class) {
single = new Singleton4();
}
}
return single;
}
}
4.双重检查
1.使用volatile关键字,防止防止 JVM 进行指令重排优化
2.进行了两次if (singleton == null)检查,如果为null,同步代码块,创建实例,否则直接返回singleton实例
public class Singleton {
private static volatile Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
5.静态代码块和静态内部类
静态代码块的方式
public class Singleton5 {
private Singleton5() {
}// 1私有化构造
private static Singleton5 single = null;// 延迟实例
// static静态代码块
static {
single = new Singleton5();
}
public static Singleton5 getInstance() {
return single;
}
}
静态内部类方式更优(懒加载)
静态内部类方式在Singleton类被装载时并不会立即实例化
public class Singleton {
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
6.枚举实现
简单枚举方式:
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
优化:内部枚举类
public class SingletonFactory {
// 内部枚举类
private enum EnmuSingleton {
SINGLETON;
private Singleton6 single;
// 枚举类的构造方法在类加载是被实例化
private EnmuSingleton() {
single = new Singleton6();
}
public Singleton6 getInstance() {
return single;
}
}
public static Singleton6 getInstance() {
return EnmuSingleton.SINGLETON.getInstance();
}
}
class Singleton6 {
public Singleton6() {
}
}
单例模式(懒汉、饿汉、同步锁、static、枚举)实现的更多相关文章
- java 设计模式 单例模式之饿汉模式/懒汉模式 singleton pattern
https://v.qq.com/x/page/e0364ung5zp.html 讲的不错, 关于 饿汉式单例模式 code Student 类: package com.test;//单例模式之 ...
- C++的单例模式与线程安全单例模式(懒汉/饿汉)
1 教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实 ...
- Java单例模式之饿汉模式与懒汉模式
单例模式是我们在开发软件的过程中经常用到的23中常用的java模式之一,主要的功能就是保证我们所使用的对象只有一个,这也在一方面减少了出错的可能性,增强了代码的健壮.单例模式一般来说有两种实现的方式, ...
- javascript单例模式(懒汉 饿汉)
第一种:懒汉模式 var Singleton=(function(){ var instantiated; //比较懒,在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢 functi ...
- java单例,懒汉&饿汉
* 单例模式Singleton * 应用场合:有些对象只需要一个就足够了,如皇帝 * 作用: 保证整个应用程序中某个实例有且只有一个 * 区别: 饿汉模式的特点是加载类时比较慢,但运行是比较快 ...
- java基础---Java---面试题---银行业务调度系统(线程同步锁、枚举、线程池)
银行业务调度系统的项目需求: 模拟实现银行业务调度系统逻辑,具体需求如下: Ø 银行内有6个业务窗口,1- 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口. Ø 有三种对应类 ...
- java基础10 单例模式之饿汉式和懒汉式单例
前言: 软件行业中有23中设计模式 单例模式 模版模式 装饰者模式 观察者模式 工厂模式 ........... 单例模式 1. 单例模式包括 1.1 饿汉式单例 1.2 ...
- java单例模式(饿汉式和懒汉式)
1 /* 2 * 设计模式:对问题行之有效的解决方式.其实它是一种思想. 3 * 4 * 1,单例设计模式 5 * 解决的问题:就是可以保证一个类在内容中的对象唯一性. 6 * 7 * 必须对于多个程 ...
- Java面试题之在多线程情况下,单例模式中懒汉和饿汉会有什么问题呢?
懒汉模式和饿汉模式: public class Demo { //private static Single single = new Single();//饿汉模式 private static S ...
- Spring中单例模式中的饿汉和懒汉以及Spring中的多例模式
链接:https://pan.baidu.com/s/1wgxnXnGbPdK1YaZvhO7PDQ 提取码:opjr 单例模式:每个bean定义只生成一个对象实例,每次getBean请求获得的都是此 ...
随机推荐
- 转载:C++类内存分布
本文转自:http://www.cnblogs.com/jerry19880126/p/3616999.html,原文写的非常好,从中学到了虚继承的概念,也学会了用VS查看内存分布. 说下C++内存分 ...
- A1054. The Dominant Color
Behind the scenes in the computer's memory, color is always talked about as a series of 24 bits of i ...
- 解决QtCreator中文乱码
在QT的菜单栏”Tools“ -> "Options" -> "Behavior" -> "File Encoding" ...
- Python Numpy shape 基础用法(转自他人的博客,如涉及到侵权,请联系我)
Python Numpy shape 基础用法 shape函数是numpy.core.fromnumeric中的函数,它的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度.它的输入 ...
- LVS管理工具ipvsadm详解与LVS-NAT模式演示
ipvsadm命令是工作在用户空间的LVS集群管理工具,原理是调用ipvs的API,在内核中生成ipvs的规则,主要用来管理集群服务和集群服务中的RealServer,使用方法类似iptables命令 ...
- RegExp 对象
什么是 RegExp? RegExp 是正则表达式的缩写. 当您检索某个文本时,可以使用一种模式来描述要检索的内容.RegExp 就是这种模式. 简单的模式可以是一个单独的字符. 更复杂的模式包括了更 ...
- 使用htpasswd实现Nginx验证访问
Nginx是一个高性能的WEB服务器,越来越多的用户使用,如果您的某个站点不希望对外公开(比如PHPMyAdmin),可以使用htpasswd实现Nginx验证访问. 安装htpasswd htpas ...
- 设计模式---对象创建模式之构建器模式(Builder)
一:概念 Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种.Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象 ...
- 《高性能Mysql》讲聚簇索引
<高性能Mysql>原文 聚簇索引如下图为聚簇所有的存储方式,聚簇实际不是一种索引,而是一种数据的存储方式,InnoDB的聚簇事假在同一个结构中保存了B-Tree索引和数据行. 当表有聚簇 ...
- 配置Arcengine10.1+java开发环境(Eclipse)
以下开发环境配置是假定用户已经安装了Java开发的IDE(Eclipse) 软件准备 (一)ArcEngine 10.1 安装包 提取码:poa0 (二)ArcGIS License Manager ...