Java 单例模式
时间:2020-04-26
本文章向大家介绍Java 单例模式,主要包括Java 单例模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点
饿汉模式
不能惰性初始化,在JVM一开始就会被初始化,
public class HungrySingleton {
//类加载时就初始化
private static HungrySingleton instance = new HungrySingleton();
private HungrySingleton() {
System.out.println("HungrySingleton is created");
}
public void run() {
System.out.println("HungrySingleton is running");
}
public static HungrySingleton getInstance() {
return instance;
}
public static void main(String[] args) {
System.out.println("start");
HungrySingleton.getInstance().run();
}
}
懒汉模式
双重锁检查,避免在多线程情况下创建多个实例,但是如果单例类实现了java.io.Serializable
接口,可能被反序列化,从而产生新的实例。
public class LazySingletonOne {
private volatile static LazySingletonOne instance;
private LazySingletonOne() {
System.out.println(("LazySingletonOne is created"));
}
public void run() {
System.out.println(("LazySingletonOne is running"));
}
public static LazySingletonOne getInstance() {
if (instance == null) {
synchronized (LazySingletonOne.class) {
if (instance == null) {
instance = new LazySingletonOne();
}
}
}
return instance;
}
public static void main(String[] args) {
System.out.println("start");
LazySingletonOne.getInstance().run();
}
}
静态内部类
将单例类设置为final
类型,能够禁止克隆的发生,同样静态内部类只有在第一次被引用时才加载,
public final class StaticNestedSingleton {
// 声明为 final 能防止其在派生类中被 clone
private StaticNestedSingleton() {
System.out.println(("StaticNestedSingleton is created"));
}
public static StaticNestedSingleton getInstance() {
return NestedClass.instance;
}
public void run() {
System.out.println("run");
}
//在第一次被引用时被加载
static class NestedClass {
private static StaticNestedSingleton instance = new StaticNestedSingleton();
}
public static void main(String[] args) {
System.out.println("start");
StaticNestedSingleton.getInstance().run();
}
}
枚举类模式
enum
方法反序列化重新创建新的对象- 类的修饰
abstract
,所以没有办法实例化,反射也不行 - 关于线程安全,是通过类加载机制来保证的,
INSTANCE
实例化的时机是在static
块中,JVM加载类的过程是线程安全的。
public enum EnumSingleton {
INSTANCE;
private final String[] preference = {"intresting", "nice", "just so so"};
public void printPreference() {
System.out.println(Arrays.toString(preference));
}
}
Java反编译查看
Compiled from "EnumSingleton.java"
public final class com.scxx.blackpanther.EnumSingleton extends java.lang.Enum<com.scxx.blackpanther.EnumSingleton> {
public static final com.scxx.blackpanther.EnumSingleton INSTANCE;
public static com.scxx.blackpanther.EnumSingleton[] values();
public static com.scxx.blackpanther.EnumSingleton valueOf(java.lang.String);
public void printPreference();
static {};
}
scala实现单例模式
object
在scala中被称作[单例对象]
object关键字创建了一个新的单例类型,就像一个class只有一个被命名的实例,如果你熟悉java,在scala中声明一个object就像创建了一个匿名类的实例。
object Singleton2Scala {
def sum(l: List[Int]): Int = l.sum
}
原文地址:https://www.cnblogs.com/iFanLiwei/p/12782323.html
- 移动商城第三篇(商品管理)【查询商品、添加商品】
- 移动商城第四篇(商品管理)【添加商品续篇、商品审核和上下架、前台展示、后台筛选】
- 移动商城第五篇(用户模块)【用户登陆、回显用户、拦截器、收货地址】
- 移动商城第六篇【单品查询、静态化页面】
- 移动商城第七篇【购物车增删改查、提交订单】
- Shiro入门这篇就够了【Shiro的基础知识、回顾URL拦截】
- OFTest(一):如何忽略一些字段在端口poll报文
- Shiro第二篇【授权、整合Spirng、过滤器】
- Ajax数据的爬取(淘女郎为例)
- 在IDEA中编写Spark的WordCount程序
- Shiro第三篇【授权过滤器、与ehcache整合、验证码、记住我】
- Spark核心RDD、什么是RDD、RDD的属性、创建RDD、RDD的依赖以及缓存、
- Caused by: java.net.ConnectException: Connection refused: master/192.168.3.129:7077
- java.util.zip.ZipException: invalid LOC header (bad signature)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 面试题系列第3篇:Integer等号判断的内幕,你可能不知道?
- Go by Example 中文:工作池
- 推荐一款万能抓包神器:Fiddler Everywhere
- 猿实战04——el-upload结合nginx之通用图片处理
- 30 多个有内味道且笑死的人代码注释
- Logstash-input-jdbc 同步 mysql 准实时数据至 ElasticSearch 搜索引擎
- 总结一些,我在书写 CSS 的时候,经常犯的错误!
- 通俗理解 set,dict 背后的哈希表
- K8S 生态周报| Google 选择 Cilium 作为 GKE 下一代数据面
- [Introduction]万字手撕Go http源码server.go
- Python 3.9 值得关注的更新点
- 趣味算法:JS实现红绳算法(匹配合适的另一半)
- 2019夏令营笔试编程题
- redis学习(四)
- 使用 Yaml 进行 selenium 的 po 设计