Java正确实现单例模式
当不用考虑线程安全时,使用传统方法可以很容易解决,这里我们在考虑线程安全性的情况下实现单例模式
1. 双检锁
这是懒加载方式
public class Singleton {private static volatile Singleton INSTANCE;private Singleton(){}public static Singleton getInstance(){if(INSTANCE == null){synchronized(Singleton.class){if(INSTANCE == null){INSTANCE = new Singleton();}}}return INSTANCE;}
}
注意
- volatile是必须的,因其保证可见性
- 第二次检查防止的情况是:多个线程都通过了第一个检查,而第一个获得锁的线程在初始化之后,其后面的线程就可以在第二个检查前止步.
性能分析
只有在第一次初始化之后由于锁的缘故,性能低了点,但此后每次执行第一个if都转到return语句,性能比第一次好了挺多
2. 静态工厂方法
这是饿汉式
public class Singleton{private static final Singleton INSTANCE = new Singleton();private Singleton(){}public static Singleton getSingleton(){return INSTANCE;}
}
分析:
当类第一次被加载到内存它才实例化,jvm会保证初始化过程的线程安全性
3. 枚举单例
这是懒加载方式
public enum Singleton {INSTANCE;private Singleton() {}
}
或许这是最简单最安全的方式了,其线程安全性由JVM保证,而且枚举天生保证序列化单例,对于反射攻击也可以保证安全,同时也没有性能缺陷
4. 静态内部类
这是懒加载方式
public class Singleton { private static class SingletonHolder { private static final Singleton INSTANCE = new Singleton(); }private Singleton (){}public static final Singleton getInstance() { return SingletonHolder.INSTANCE; }
}
分析:
SingletonHolder隐藏在内部不会被外部了解,这种方式没有性能缺陷
欢迎访问我的 个人网站(主要), Github, CSDN(主要), 博客园, 简书, 掘金, 知乎, 微信公众号:HelloVant(主要)
本文采用 知识共享 署名-非商业性使用-禁止演绎(CC by-nc-nd) 4.0 国际 许可协议 授权
Java正确实现单例模式相关推荐
- 在Java中实现单例模式的有效方法是什么? [关闭]
在Java中实现单例模式的有效方法是什么? #1楼 我使用Spring框架来管理我的单身人士. 它不会强制类的"单一性"(如果涉及多个类加载器,您将无法真正做到),但是它提供了一种 ...
- Java多线程之单例模式在多线程环境下的安全问题
Java多线程之单例模式在多线程环境下的安全问题 目录: 单例模式基本概念 单线程下的单例模式 多线程下的单例模式 单例模式volatile分析 1. 单例模式基本概念 基本概念转载自:单例模式|菜鸟 ...
- java单例模式_在Java中实现单例模式
该单例模式保证只有一个带有全局访问点对象可以在给定的时间实例被创建.这是面向对象编程中最常用的技术之一.虽然它很简单,也许从类设计的角度来看最简单,但在尝试实现它们之前,必须先了解一些微妙的问题.本文 ...
- Java中的单例模式
2019独角兽企业重金招聘Python工程师标准>>> 最近网上查找资料做了一下总结,Java中的单例模式主要是有以下两种实现方式: 1.public class Singleton ...
- Java正确获取客户端真实IP方法整理
转载自 干货:Java正确获取客户端真实IP方法整理 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apach ...
- Java设计模式之单例模式(七种写法)
Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton {private static Singleton ...
- Java设计模式之单例模式的学习
本篇是本人的第二篇博客 旨在记录本人对于Java设计模式之单例模式的学习和理解,也希望本篇可以对一些正在学习的小伙伴起到一些帮助 单例模式(singleton)的特点: 1.单例模式有且仅有一个实例: ...
- 【Java设计模式】单例模式
### 1. 概述 > 单例模式是确保某一个类中有且只有一个实例. ---------- ### 2. 饿汉式单例 ``` java public class SingletonInstance ...
- Java提高篇——单例模式
阅读目录 介绍 在我们日常的工作中经常需要在应用程序中保持一个唯一的实例,如:IO处理,数据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创建或始终使用一个公用的实例,这就是 ...
最新文章
- 排序学习之---快速排序
- Web应用渗透测试框架Arachni
- oracle case grouping,ORACLE GROUPING函數的使用
- 剑指offer——面试题10:斐波那契数列
- String.format() 格式化字符串
- toj 4606 Homework Checker
- 史上最便宜Model 3开售!降价3万 468公里续航国产特斯拉开回家
- Currently, the Linux Mint team has 21 members
- python中用箱线图分析异常值_[宜配屋]听图阁
- ORB-SLAM3: An Accurate Open-Source Library for Visual, Visual-Inertial and Multi-Map SLAM
- QQ音乐下载的flac文件转码mp3文件
- 用window.dialogArguments时出现window.dialogArguments is undefined
- Nessus部署及简单使用
- MySQL数据分析-(12)表操作补充:字段属性
- VS2022解决方案及项目重命名
- Rasa课程、Rasa培训、Rasa面试系列之:Rasa客户案例PicPay公司
- 08-20210305在WIN10下通过网口给华为海思Hi3516DV300刷机(鸿蒙系统)
- 国际手机号码格式化 和 手机邮箱中间部分用****替换
- 抖音推荐机制算法,抖音算法推荐模式,抖音算法机制流程图
- 相关分析怎么进行?有哪些条件?
热门文章
- 联想小新潮7000安装deepin 系统
- 计算机动画_3dsmax的使用(四)
- 习题 8.5 将本章的例8.4改写为一个多文件的程序:1.将类定义放在头文件arraymax.h中;2.将成员函数定义放在源文件arraymax.cpp中;3.主函数放在源文件file1.cpp中。
- 我的世界低延迟的服务器,TcpAckFrequency——降低服务器延迟!!!
- “她经济”:新消费升级背景下3.8女王节的五大趋势
- 浏览器缓存(强缓存和协商缓存)
- Sprite Packer 打包
- python输出一个空心爱心
- 谷歌浏览器的$http_user_agent
- 华为开发者大赛活动汇总