java中安全的单例与不安全的单例

1.内部静态类(安全的)

public class Singleton {
private static class SingletonHolder{
private final static Singleton instance=new Singleton();
} public static Singleton getInstanceStaticInnerClass(){
return SingletonHolder.instance;
}
}

2.饿汉模式(安全的)

利用静态类的加载构成的天然线程安全的单例
这就是饥饿模式,不管是否用到都创建对象,如果对象太大会造成内存浪费。 public class Singleton {
private static Singleton safeSingleton=null; static {
safeSingleton=new Singleton();
} public static Singleton getInstanceSafe(){
return safeSingleton;
}
}

3.懒汉模式(不安全)

因为饿汉模式在对象不被使用时会浪费内存,因此可以在使用时再创建对象。

但是在多线程中不安全,因为在new时对象具有不可见性

public class Singleton {
private static Singleton singleton=null;
private Singleton(){ }
public static Singleton getInstanceSimpleLazy(){
if(singleton==null){
singleton=new Singleton(); }
return singleton;
}
}

4.双检锁(不安全)

//双检锁
//双检锁的问题:多线程中可能会返回一个未被初始化完毕的对象。
//原因:初始化对象的步骤是 1.为对象分配内存 2.初始化对象 3.将对象指向singleton
//由于2依赖于1,1,2不会被重排序。2,3没有依赖性可能会被重排序。也就是说可能会先将一个null的对象指向singleton,而此时该对象又正在被初始化。
//假设此时另外一个线程来访问singleton,那么就会返回一个null对象 public class Singleton {
private static Singleton singleton=null;
private static Object ob=new Object();
private Singleton(){ }
public static Singleton getInstanceDoubleCheck(){
if(singleton==null){
synchronized(ob){
if(singleton==null){
singleton=new Singleton();
}
}
}
return singleton;
}
}

5.枚举(安全的,建议使用)

调用方法:Factory.INSTANCE.getResource
INSTANCE: 是被static final声明了的Factory 的实例。
enum的申明: public abstract class Enum<E extends Enum<E>>
implements Comparable<E>, Serializable class Resource{ } public enum Factory{
INSTANCE;
private Resource resource;
Factory(){
resource=new Resource();
} public Resource getResource(){
return resource;
} }

java中安全的单例与不安全的单例的更多相关文章

  1. Java中如何分析一个案列---猫狗案例为例

    猫狗案例: 具体事务: 猫.狗 共性: 姓名.年龄.吃饭 分析:从具体到抽象 猫: 姓名.年龄--->成员变量 吃饭       ---> 成员方法 构造方法:无参.有参 狗: 姓名.年龄 ...

  2. 为什么枚举单例在 Java 中更好?

    枚举单例是使用一个实例在 Java 中实现单例模式的新方法.虽然Java中的单例模式存在很长时间,但枚举单例是相对较新的概念,在引入Enum作为关键字和功能之后,从Java5开始在实践中.本文与之前关 ...

  3. Java中的ThreadLocal深入理解

    提到ThreadLocal,有些Android或者Java程序员可能有所陌生,可能会提出种种问题,它是做什么的,是不是和线程有关,怎么使用呢?等等问题,本文将总结一下我对ThreadLocal的理解和 ...

  4. 理解Java中的ThreadLocal

    提到ThreadLocal,有些Android或者Java程序员可能有所陌生,可能会提出种种问题,它是做什么的,是不是和线程有关,怎么使用呢?等等问题,本文将总结一下我对ThreadLocal的理解和 ...

  5. 2017.10.19 java中的关键词 及软件开发的一些重要单词

    1.java中的关键词 ·final 最后的 (1)可以修饰表示该类不能被继承 (2)可以修饰方法不能被重写 ·sattic 静态的 类的 (1)修饰属性 可以通过类直接调用 可以通过对象调用 (2) ...

  6. 一文彻底搞懂Java中的环境变量

    一文搞懂Java环境变量 记得刚接触Java,第一件事就是配环境变量,作为一个初学者,只知道环境变量怎样配,在加上各种IDE使我们能方便的开发,而忽略了其本质的东西,只知其然不知其所以然,随着不断的深 ...

  7. java中你确定用对单例了吗?

    作为程序员这样的特殊物种来说,都掌握了一种特殊能力就是编程思想,逻辑比較慎重,可是有时候总会忽略到一些细节,比方我,一直以来总认为Singleton是设计模式里最简单的,不用太在意,然而就是由于这样的 ...

  8. Java中Class和单例类的作用与类成员的理解

    Java中Class类的作用与深入理解 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着每个对象所属的类.JVM利用运行时信息选择相应的方法执行.而保存 ...

  9. 再看 Java 中的单例

    此前面试遇到了单例问题,本以为已经背的滚瓜烂熟,没想到被问单例如何避免被反射和序列化破坏,虽然后来还是等到了通知,但还是复习一下单例的实现方式,并学习防止反射和序列化破坏的手段. 基本实现方式 其他相 ...

随机推荐

  1. CSingleLock

    CSingleLock通常和CCriticalSection配合使用.总结这种用法

  2. Excel催化剂图表系列之一键完成IBCS国际商业标准图表

    在数据分析领域,最后一公里的图表输出,是一片十分广阔的领域.一直以来,笔者深知不是这一方面的能手,学习上也仅仅是浅尝而止.没有往其深入研究并有所产出.很幸运地在数据圈子能够结识到其他的志同道合的伙伴, ...

  3. [OpenGL] 绘制并且判断凹凸多边形、自相交多边形。

    #include <iostream> #include <ctime> #include <GL/glut.h> #include <math.h> ...

  4. 2019牛客多校第二场D-Kth Minimum Clique

    Kth Minimum Clique 题目传送门 解题思路 我们可以从没有点开始,把点一个一个放进去,先把放入一个点的情况都存进按照权值排序的优先队列,每次在新出队的集合里增加一个新的点,为了避免重复 ...

  5. Webpack概念

    webpack概念 我经常用 webpack,打算做一次比较详细的概念清点和梳理.从 0 配置 webpack,由于 webpack5(2019.07.27)暂时还没有发布.并且从Webpack Mi ...

  6. 0728 history

    -- :: cd /etc/yum.repos.d/ -- :: wget http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox. ...

  7. java 第五章

    java 第五章   while 循环语句 语法:while(循环条件){ //循环操作 循环条件自加: } while循环结构的特点:先判断,在执行.    while   的执行步骤 (1) 声明 ...

  8. Reporting报表开发知识合并[个人原创]

    [个人原创] ,转发请声明原文链接 了解 a)      SSRS全称 SQL Server Reporting Services,是依赖于数据库运行的,是微软开发的重量级别的BI产品 b)      ...

  9. 解决axios接收二进制流文件乱码问题

    1. 须将axios 配置中的responseType设置为'arraybuffer',这样就不会让表格出现乱码现象: 2. 如果要动态设置文件名则需要让后台将名字设置到响应头中,否则将是一个乱码的文 ...

  10. Selenium浏览器自动化测试框架

    selenium简介 介绍 Selenium [1]  是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 1 ...