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 中的单例
此前面试遇到了单例问题,本以为已经背的滚瓜烂熟,没想到被问单例如何避免被反射和序列化破坏,虽然后来还是等到了通知,但还是复习一下单例的实现方式,并学习防止反射和序列化破坏的手段. 基本实现方式 其他相 ...
随机推荐
- ~~核心编程(四):面向对象——单继承&复写~~
进击のpython 继承 继承的出现!就是一个作用! 为了节省代码! 为什么说节省代码? 你爸爸要是王健林 你是不是就不用愁怎么获得钱了? 为啥? 是不是钱已经有了! 直接拿来用就行了! 我们想一下奥 ...
- 别混淆了sizeof(数组名)和sizeof(指针)
我们在挨个儿输出一个数组中的元素时,最常用的就是用一个for循环来实现,简单了事.比如类似下面的代码片段: for(i = 0; i< length; i++) { printf("数 ...
- python 3.5学习笔记(第三章)
本章内容 1.集合及其运算 2.文件操作 3.字符编码与转码 4.函数与函数式编程 5.局部变量与全局变量 6.递归 7.补充知识点 一.集合及其运算 1.概念: set集合是一个不重复元素集,用 { ...
- 作为前端程序员的她凭什么成为Judy团队第一位助教?
Judy团队第一位助教-俊英子:正直,阳光,向上,自律,优秀的女孩,当然这些词语还是无法描述出她的优秀 英子,我们第一次的时候,2月25号,下午16:26分,她突然发了一段长的文字我. 她说她一直在读 ...
- html提示框插件
最近工作需要,用到各式各样的提示框,寻找了很久,发现一个的第三方的插件很好用,各种样式.接口良好.允许自定义. 官网:http://layer.layui.com/ 使用需要先引入jq1.8以上: & ...
- JAVA面试题 线程的生命周期包括哪几个阶段?
面试官:您知道线程的生命周期包括哪几个阶段? 应聘者: 线程的生命周期包含5个阶段,包括:新建.就绪.运行.阻塞.销毁. 新建:就是刚使用new方法,new出来的线程: 就绪:就是调用的线程的star ...
- 关于Servlet小总结
目录 Servlet Servlet简介 Servlet简单实现 Servlet注解 Servlet生命周期 启动时加载Servlet Servlet客户端 HTTP请求的结构 Servlet服务器 ...
- 如何在Windows上使用Python进行开发
本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 一直以来C#都是微软在编程语言方面最为显著的Tag,但时至今日Python ...
- python课堂整理15---map, filter,reduce函数
一.map函数 处理序列(可迭代对象)中的每一个元素,得到的结果是一个‘列表’(其实是个迭代器),该‘列表’元素个数及位置与原来一样 理解下面这段代码: num_l = [1, 2, 4, 6] de ...
- 常用服务部署脚本(nodejs,pyenv,go,redis,)
根据工作总结的常用安装脚本,要求linux-64系统 #!/bin/bash path=/usr/local/src node () { cd $path #wget https://nodejs.o ...