简介
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,任务管理器、线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。在项目当中,系统启动读取配置文件就需要单例保证配置的一致性。
要点与实现
要点
实现
实现单例模式方式
/** 饿汉式单例模式*/
public class Singleton {
private Singleton(){}//私有构造器
/*
* JVM只为静态分配一次内存,在加载类的过程中
* 完成静态变量的内存分配,天然的是线程安全的
*/
private static Singleton singleton=new Singleton();
public static Singleton getInstance(){//静态工厂方法
return singleton;
}
}
/** 懒汉式单例模式*/
public class Singleton {
private Singleton(){}//私有构造器
private static Singleton singleton=null;//静态变量
/**
* 延迟加载,需要的时候初始化,方法加锁,并发效率低
*/
public static synchronized Singleton getInstance(){
if(singleton==null){
singleton=new Singleton();
}
return singleton;
}
}
/**双重锁单例模式*/
public class Singleton {
private Singleton(){}//私有构造器
private static volatile Singleton singleton=null;//静态变量 可见性和指令重排序都保证
/**
* 避免整个方法被锁,只对需要锁的代码部分加锁,可以提高执行效率。
*/
public static Singleton getInstance(){
if(singleton==null){
synchronized (Singleton.class){
if(singleton==null){
singleton=new Singleton();//非原子操作
}
}
}
return singleton;
}
}
/**静态内部类模式*/
public class Singleton {
private Singleton(){}//私有构造器
private static class SingletonClassInstance{
//static final 保证对象只会被赋值一次
private static final Singleton instance=new Singleton();
}
public static Singleton getInstance(){
return SingletonClassInstance.instance;
}
}
/**静态代码块实现**/
public class Singleton {
private Singleton(){}//私有构造器
private static Singleton singleton=null;//静态变量
//静态代码块
static {
singleton=new Singleton();
}
public static Singleton getInstance(){
return singleton;
}
}
/*枚举的单例模式*/
public class Singleton {
private Singleton (){}//私有构造
public static Singleton getInstance(){
return SingletonEnum.INSTANCE.getInstance();
}
/*目前最为安全的实现单例的方法是通过内部静态enum的方法来实现,
*因为JVM会保证enum不能被反射并且构造器方法只执行一次。*/
private enum SingletonEnum{
INSTANCE;
private Singleton singleton;
//JVM会保证此方法绝对只调用一次
private SingletonEnum(){
singleton=new Singleton();
}
public Singleton getInstance(){
return singleton;
}
}
}
反射攻击示例
计算下列的表达式public static void main(String[] args) { int i = 5; int j = i+++i+++i++; System.out.println(j); int k = 0; int o = ++k+k<<2+ ++k+k+1; System.out.println(o); }"C:\Program Files\Java\jdk1.8_自称自觉运算服务的先后顺序
导语:许多win10用户都喜欢将常用的应用程序快捷方式图标固定在任务栏上,这样就可以单击这个图标快速启动软件。那么你知道任务栏图标存放在哪个文件夹里面吗? 下面白豆芽就和大家分享Win10系统任务栏里的小图标都保存在什么文件夹里具体路径是什么。一般来说任务栏图标文件夹在用户文件夹内,不同的登录用户文件夹路径也是不同的。找到任务栏图标文件夹技巧:1、按住SHIFT,然后右键点击图标,我们可以看到“复..._win10 html文件放在哪
前言最近在学习Python的面向对象编程,以前是没有接触过其它的面向对象编程的语言,因此学习这一部分是相当带劲的,这里也总结一下。概述python支持多种编程范式:面向过程、面向对象、面向切面(装饰器部分)等。面向过程:根据业务逻辑从上到下写垒代码函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可面向对象:对函数进行分类和封装,让开发“更快更好更强...”OOP思想面向对象的基本..._ython支持多种编程范式:面向过程、面向对象、面向切面(装饰器部分)等。面向过程:
描述一直以来写linux驱动,都是按照固定格式,定义一个初始化和退出函数,书上告诉我这两个函数会被调用,至于为什么会被调用,在哪调用,一直不清楚。偶然的一个机会,看到blob里面的代码,里面有一个初始化函数列表。按照一般的编程想法,各部分的初始化函数会在一个固定的函数里调用比如:void init(void){init_a();init_b();}如果再加入一个初始化函数呢,那么再init_b()...
2019独角兽企业重金招聘Python工程师标准>>> ...
Hive将表中的元数据信息存储在数据库中,如derby(自带的)、Mysql(实际工作中配置的)。通过Mysql进行示例说明:Hive数据仓库中: MySql数据库中存储的相应元数据信息: Navicate(远程连接的MySql)对应的元数据信息: Hive中创建的表在hive中可以看到正常的数据,但是在mysql中只能查到hive中表的元数据信息。..._hive元数据中包含
在iPhone开发中,一个应用程序应该只有一个UIWindow的实例,UIWindow在iPhone中是UIView的一个特殊子类,在程序初始化时,通过装载MainWindow.xib或者在代码中创建,它的大小应该就是手机屏幕的大小,并且不应该像普通的UIView一样,设置UIWindow实例——一个特殊的UIView实例——的UIView中的属性。一个UIView的实例就是一个视图,...
耳熟能详的阿里云背后,有一支成立两年却鲜为人知,始终低调摸索云生态建设的团队——云市场。云市场,也是阿里云官网上的软件市场。顾名思义,是阿里云打造的、针对第三方软件和服务的交易平台。阿里云业务运营事业部总经理杨名解读云市场新战略4月20日,云栖大会深圳峰会,以“云市场,大生态”为主题的《云市场专场》上,阿里云业务运营事业部总经理杨名..._阿里云第三方应用市场定位
技术栈:Redis、Nginx、Springboot、maven、Git第一天项目背景在线教育:网络教学商业模式B2B2C、B2C(管理员和普通用户)功能模块系统后台(管理员):讲师管理模块、课程分类管理模块、课程管理模块、统计分析模块、订单管理模块、banner模块(轮播图)、权限管理模块系统前台(普通用户):首页数据显示、讲师列表和详情、课程列表和课程详情、登录和注册功能、微信扫码登录、微信扫码支付技术栈前后端分离开发:后端技术:Springboot、Spr_谷粒学苑技术栈
配置vim主要分为两大部分:一个是通过set设置vim的属性;另一个是插件下载。_vim写代码时自动补全
一、错误描述1、问题 java.io.IOException: error=2, 没有那个文件或目录 今天在刚重新搭建好的64位的Center OS上安装好了Android SDK,Jenkins,Git等一系列用于持续集成的环境之后,准备编译下项目试一试,然后Jenkins编译失败,错误如下所示:..._rubygrapefruit.platform.internal.defaultprocesslauncher.start(defaultprocess
为什么80%的码农都做不了架构师?>>> ...