安全发布对象

  • 在静态初始化函数中初始化一个对象引用
  • 将对象的引用保存到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安全的发布对象相关推荐

  1. 【Java并发编程】安全发布对象

    文章目录 安全发布对象 一.对象发布 二.对象逸出 三.安全发布的方法 安全发布对象 一.对象发布 在介绍安全发布对象之前,应该首先聊一聊什么是发布对象.发布对象是"使一个对象能够被当前范围 ...

  2. java高并发(七)发布对象

    发布对象 发布对象:是指使一个对象能够被当前范围之外的代码所使用. 对象逸出:一种错误的发布.当一个对象还没有构造完成时,就使它被其他线程所见. 我们经常需要发布一些对象例如通过类的非私有方法返回对象 ...

  3. java 安全发布对象_Java安全的发布对象

    安全发布对象 在静态初始化函数中初始化一个对象引用 将对象的引用保存到volatile类型域或者AtomicReference对象中 将对象的引用保存到某个正确构造对象的final类型域中 将对象的引 ...

  4. java 共享软件 保护_【Java并发.3】对象的共享

    本章将介绍如何共享和发布对象,从而使他们能够安全地由多个线程同时访问.这两章合在一起就形成了构建线程安全类以及通过java.util.concurrent 类库来构建开发并发应用程序的重要基础. 3. ...

  5. 从安全和不安全两个角度,教你如何发布对象(含各种单例代码)

    本文分享自华为云社区<[高并发]如何安全的发布对象(含各种单例代码分析)>,作者: 冰 河 . 今天,为大家带来一篇有技术含量的文章,那就是在高并发环境下如何安全的发布对象实例. 发布对象 ...

  6. java的几种对象(PO,VO,DAO,BO,POJO)解释(转)

      [ 作者:赵小刀 ][ 大小:1k ][ 发布日期:2005-08-22 ][ 浏览:8678 ]      java的几种对象(PO,VO,DAO,BO,POJO)解释      一.PO:pe ...

  7. java比较两个对象_java判断两个对象是否相等的方法

    java判断两个对象是否相等的方法 发布时间:2020-06-25 13:48:38 来源:亿速云 阅读:197 作者:Leah 这期内容当中小编将会给大家带来有关java判断两个对象是否相等的方法, ...

  8. 安全发布对象-发布与逸出

    发布对象 简单来说就是提供一个对象的引用给作用域之外的代码.比如return一个对象,或者作为参数传递到其他类的方法中. 不安全的发布对象示例: @Slf4j @NotThreadSafe publi ...

  9. 基于java的新闻发布及管理系统设计与实现(项目报告+答辩PPT+源代码+数据库+截图+部署视频)

    项目说明报告 题  目:新闻发布及管理系统的设计与实现 本课题来源及研究现状:  课题来源 21世纪是信息的时代,是网络的时代,进入信息社会高速发展的时代,数字化革命给所有领域带来新的改变.信息技术的 ...

最新文章

  1. 使用C语言中的宏来定位出错信息
  2. [html] 一般习惯把js写在</body>前,但有例外的情况吗?说说看
  3. 机器学习实战:PCA降维 样本协方差
  4. 数魔选品怎么样_Sellermotor数魔跨境好不好用?怎么样?
  5. Centre Consortium 发布了USDC 智能合约 2.1 版本
  6. Windows服务创建及安装
  7. 计算机系统结构自考知识点总结,自考《计算机系统结构》问答题总结(3)
  8. asp.net 获取当前页面html代码,在asp.net中获取当前页面的URL的方法(推荐)
  9. 知识点收录04:MAVEN相关的知识点
  10. 世界3大IT服务品牌之一塔塔咨询服务公司发布新品牌宣言
  11. ISO9001:2000标准的主要特点和要求(转载)
  12. win10 插入鼠标自动禁用触摸板的方法
  13. 研究生硕士论文开题报告中的进度和安排该怎么写?
  14. js实现首尾相连左右循环切换效果
  15. sd卡卡槽_一种SD卡卡槽的制作方法
  16. 数据库隔离级别解决脏读、不可重复读、幻读
  17. Centos用speedtest.py测试服务器(国外)上传下载速度
  18. 可信平台模块TPM(Trusted Platform Module)介绍及tpm-tools安装使用
  19. linux - 时间时区设置
  20. 拇指射箭服务器维护,拇指射箭1小游戏:这个拇指射箭3D游戏有点意思,拇指枪王对决...

热门文章

  1. 如何使用vue使同一个弹窗同时能实现添加和编辑
  2. cmake添加查找目录_cmake find_package路径详解
  3. 用perl发送http请求
  4. Javascript获取select下拉框选中的的值
  5. 判断当前日期是否在[startDate, endDate]区间
  6. Net::OpenSSH 模块使用实例
  7. Informix常用操作方法命令
  8. WEB-INF目录 与 META-INF目录的作用
  9. Linux文件权限的解析
  10. POJ 2385 DP