java中安全的单例与不安全的单例
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中安全的单例与不安全的单例的更多相关文章
- Java中如何分析一个案列---猫狗案例为例
猫狗案例: 具体事务: 猫.狗 共性: 姓名.年龄.吃饭 分析:从具体到抽象 猫: 姓名.年龄--->成员变量 吃饭 ---> 成员方法 构造方法:无参.有参 狗: 姓名.年龄 ...
- 为什么枚举单例在 Java 中更好?
枚举单例是使用一个实例在 Java 中实现单例模式的新方法.虽然Java中的单例模式存在很长时间,但枚举单例是相对较新的概念,在引入Enum作为关键字和功能之后,从Java5开始在实践中.本文与之前关 ...
- Java中的ThreadLocal深入理解
提到ThreadLocal,有些Android或者Java程序员可能有所陌生,可能会提出种种问题,它是做什么的,是不是和线程有关,怎么使用呢?等等问题,本文将总结一下我对ThreadLocal的理解和 ...
- 理解Java中的ThreadLocal
提到ThreadLocal,有些Android或者Java程序员可能有所陌生,可能会提出种种问题,它是做什么的,是不是和线程有关,怎么使用呢?等等问题,本文将总结一下我对ThreadLocal的理解和 ...
- 2017.10.19 java中的关键词 及软件开发的一些重要单词
1.java中的关键词 ·final 最后的 (1)可以修饰表示该类不能被继承 (2)可以修饰方法不能被重写 ·sattic 静态的 类的 (1)修饰属性 可以通过类直接调用 可以通过对象调用 (2) ...
- 一文彻底搞懂Java中的环境变量
一文搞懂Java环境变量 记得刚接触Java,第一件事就是配环境变量,作为一个初学者,只知道环境变量怎样配,在加上各种IDE使我们能方便的开发,而忽略了其本质的东西,只知其然不知其所以然,随着不断的深 ...
- java中你确定用对单例了吗?
作为程序员这样的特殊物种来说,都掌握了一种特殊能力就是编程思想,逻辑比較慎重,可是有时候总会忽略到一些细节,比方我,一直以来总认为Singleton是设计模式里最简单的,不用太在意,然而就是由于这样的 ...
- Java中Class和单例类的作用与类成员的理解
Java中Class类的作用与深入理解 在程序运行期间,Java运行时系统始终为所有的对象维护一个被称为运行时的类型标识.这个信息跟踪着每个对象所属的类.JVM利用运行时信息选择相应的方法执行.而保存 ...
- 再看 Java 中的单例
此前面试遇到了单例问题,本以为已经背的滚瓜烂熟,没想到被问单例如何避免被反射和序列化破坏,虽然后来还是等到了通知,但还是复习一下单例的实现方式,并学习防止反射和序列化破坏的手段. 基本实现方式 其他相 ...
随机推荐
- 《深入理解 Java 内存模型》读书笔记
查看系统自带的函数 hive> show functions; 2)显示自带的函数的用法 hive> desc function upper; 3)详细显示自带的函数的 ...
- C语言入门8-数组-基本算法
一. 什么是数组 数组就是具有相同数据类型的有序集合. 分为一维数组.二维数组及多维数组. 一维数组就是用一个下标定义的数组 二维数组就是用二个下标定义的数组 我们把具有三个下标及三 ...
- C#3.0新增功能03 隐式类型本地变量
连载目录 [已更新最新开发文章,点击查看详细] 从 Visual C# 3.0 开始,在方法范围内声明的变量可以具有隐式“类型”var. 隐式类型本地变量为强类型,就像用户已经自行声明该类型,但 ...
- C#3.0新增功能09 LINQ 基础06 LINQ 查询操作中的类型关系
连载目录 [已更新最新开发文章,点击查看详细] 若要有效编写查询,应了解完整的查询操作中的变量类型是如何全部彼此关联的. 如果了解这些关系,就能够更容易地理解文档中的 LINQ 示例和代码示例. ...
- [leetcode ]429. N-ary Tree Level Order Traversale (easy)
原题 思路: bfs,每一层遍历一次加到一个vector,同时把该点的子元素加到queue中. class Solution { public: vector<vector<int> ...
- [leetcode]python 448. Find All Numbers Disappeared in an Array
Given an array of integers where 1 ≤ a[i] ≤ n (n = size of array), some elements appear twice and ot ...
- c实现生产者消费者问题。 windows下。
#include <stdio.h>#include <windows.h> #define P(S) WaitForSingleObject(S,INFINITE)//定义W ...
- 第一章: 初识Java
计算机程序:计算机为完成某些功能产生的一系列有序指令集合. Java技术包括:JavaSE(标准版) JavaEE(企业版) ---JavaME(移动版) 开发Java程序步骤:1.编写 2.编译 3 ...
- xml的四种解析方式(转载)
众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml- ...