Java安全的发布对象
安全发布对象
- 在静态初始化函数中初始化一个对象引用
- 将对象的引用保存到volatile类型域或者AtomicReference对象中
- 将对象的引用保存到某个正确构造对象的final类型域中
- 将对象的引用保存到一个由锁保护的域中
Spring 框架中,Spring管理的类都是单例模式。如何保证一个实例只被初始化一次,且线程安全?通过不同单例的写法,具体描述安全发布对象的四种方法:
在静态初始化函数中初始化一个对象的引用(不推荐)
package com.rumenz.task.single;//线程安全
//饿汉模式
//静态代码块初始化
public class SingletonExample {private SingletonExample(){//初始化操作}private static SingletonExample singletonExample=null;static {singletonExample=new SingletonExample();}public static SingletonExample getInstance(){return singletonExample;}
}//或者
package com.rumenz.task.single;
//线程安全
//饿汉模式
//静态代码块初始化
public class SingletonExample {private SingletonExample(){//初始化操作}private static SingletonExample singletonExample=new SingletonExample();public static SingletonExample getInstance(){return singletonExample;}
}
缺点:用不用都会初始化对象,如果初始化工作较多,加载速度会变慢,影响系统性能。
将对象的引用保存到volatile
类型或AtomicReference
对象中(推荐)
package com.rumenz.task.single;//线程安全
//懒汉模式
public class SingletonExample1 {private SingletonExample1() {//初始化操作}// 1、memory = allocate() 分配对象的内存空间// 2、ctorInstance() 初始化对象// 3、instance = memory 设置instance指向刚分配的内存// 单例对象 volatile + 双重检测机制 -> 禁止指令重排private volatile static SingletonExample1 singletonExample1=null;//静态工厂方法public static SingletonExample1 getInstance(){if(singletonExample1==null){ //双重检测synchronized(SingletonExample1.class){ //同步锁if(singletonExample1==null){singletonExample1=new SingletonExample1();}}}return singletonExample1;}
}
优点:按需加载
缺点:第一次初始化的时候可能会比较慢
通过synchronized
(不推荐)
package com.rumenz.task.single;public class SingletonExample3 {//私有构造函数private SingletonExample3(){//初始化操作}private static SingletonExample3 singletonExample3=null;//静态的工厂方法public static synchronized SingletonExample3 getSingletonExample3(){if(singletonExample3==null){singletonExample3=new SingletonExample3();}return singletonExample3;}
}
缺点:每次进入
getSingletonExample3
都会加锁,耗费资源,故不推荐使用。
枚举(推荐)
package com.rumenz.task.single;public class SingletonExample4 {//私有构造函数private SingletonExample4(){//初始化}public static SingletonExample4 getSingletonExample4(){return Singleton.INSTANCE.getSingleton();}private enum Singleton{INSTANCE;private SingletonExample4 singleton;Singleton(){singleton=new SingletonExample4();}public SingletonExample4 getSingleton(){return singleton;}}
}
优点:天然线程安全,可防止反射生成实例,推荐使用
Java安全的发布对象相关推荐
- 【Java并发编程】安全发布对象
文章目录 安全发布对象 一.对象发布 二.对象逸出 三.安全发布的方法 安全发布对象 一.对象发布 在介绍安全发布对象之前,应该首先聊一聊什么是发布对象.发布对象是"使一个对象能够被当前范围 ...
- java高并发(七)发布对象
发布对象 发布对象:是指使一个对象能够被当前范围之外的代码所使用. 对象逸出:一种错误的发布.当一个对象还没有构造完成时,就使它被其他线程所见. 我们经常需要发布一些对象例如通过类的非私有方法返回对象 ...
- java 安全发布对象_Java安全的发布对象
安全发布对象 在静态初始化函数中初始化一个对象引用 将对象的引用保存到volatile类型域或者AtomicReference对象中 将对象的引用保存到某个正确构造对象的final类型域中 将对象的引 ...
- java 共享软件 保护_【Java并发.3】对象的共享
本章将介绍如何共享和发布对象,从而使他们能够安全地由多个线程同时访问.这两章合在一起就形成了构建线程安全类以及通过java.util.concurrent 类库来构建开发并发应用程序的重要基础. 3. ...
- 从安全和不安全两个角度,教你如何发布对象(含各种单例代码)
本文分享自华为云社区<[高并发]如何安全的发布对象(含各种单例代码分析)>,作者: 冰 河 . 今天,为大家带来一篇有技术含量的文章,那就是在高并发环境下如何安全的发布对象实例. 发布对象 ...
- java的几种对象(PO,VO,DAO,BO,POJO)解释(转)
[ 作者:赵小刀 ][ 大小:1k ][ 发布日期:2005-08-22 ][ 浏览:8678 ] java的几种对象(PO,VO,DAO,BO,POJO)解释 一.PO:pe ...
- java比较两个对象_java判断两个对象是否相等的方法
java判断两个对象是否相等的方法 发布时间:2020-06-25 13:48:38 来源:亿速云 阅读:197 作者:Leah 这期内容当中小编将会给大家带来有关java判断两个对象是否相等的方法, ...
- 安全发布对象-发布与逸出
发布对象 简单来说就是提供一个对象的引用给作用域之外的代码.比如return一个对象,或者作为参数传递到其他类的方法中. 不安全的发布对象示例: @Slf4j @NotThreadSafe publi ...
- 基于java的新闻发布及管理系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+部署视频)
项目说明报告 题 目:新闻发布及管理系统的设计与实现 本课题来源及研究现状: 课题来源 21世纪是信息的时代,是网络的时代,进入信息社会高速发展的时代,数字化革命给所有领域带来新的改变.信息技术的 ...
最新文章
- 使用C语言中的宏来定位出错信息
- [html] 一般习惯把js写在</body>前,但有例外的情况吗?说说看
- 机器学习实战:PCA降维 样本协方差
- 数魔选品怎么样_Sellermotor数魔跨境好不好用?怎么样?
- Centre Consortium 发布了USDC 智能合约 2.1 版本
- Windows服务创建及安装
- 计算机系统结构自考知识点总结,自考《计算机系统结构》问答题总结(3)
- asp.net 获取当前页面html代码,在asp.net中获取当前页面的URL的方法(推荐)
- 知识点收录04:MAVEN相关的知识点
- 世界3大IT服务品牌之一塔塔咨询服务公司发布新品牌宣言
- ISO9001:2000标准的主要特点和要求(转载)
- win10 插入鼠标自动禁用触摸板的方法
- 研究生硕士论文开题报告中的进度和安排该怎么写?
- js实现首尾相连左右循环切换效果
- sd卡卡槽_一种SD卡卡槽的制作方法
- 数据库隔离级别解决脏读、不可重复读、幻读
- Centos用speedtest.py测试服务器(国外)上传下载速度
- 可信平台模块TPM(Trusted Platform Module)介绍及tpm-tools安装使用
- linux - 时间时区设置
- 拇指射箭服务器维护,拇指射箭1小游戏:这个拇指射箭3D游戏有点意思,拇指枪王对决...