单例模式
单例模式是开发中属于经常用到的模式之一也是相对比较简单的,单例顾名思义即在应用中始终存在一个实例这也对应了其特点:
- 单例类只能有一个类。
- 自己创建自身的唯一实例。
- 将自身提供给所有其它类。
单例模式主要分为以下几种写法,不同的写法有着不同的说法,下面我们一起来看下
首先是简单单例写法,即在初始化类的时候创建了实例。
/**
*
* @author Col.Man
* <p> 简单单例模式 </p>
*/
public class Singleton {
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
private Singleton() {
}
}
当类被加载上静态变量instance将被初始化,此时的私有构造函数被调用,创建Singleton的唯一实例。
private static Singleton instance = new Singleton();
此种写法是典型的拿空间换时间,在类加载时即创建,不管你用不用,每次使用时不用做判断节省了运行时间,假如创建这个对象需要耗费大量的空间且创建后不予是使用,那岂不是浪费,况且在单例模式中一般都是通过getInstance()来触发类加载,显然这种不是很理想,也没达到懒加载的效果。
那么就引出来简单单例模式的进化版lazy loaded
public class Singleton {
private static Singleton instance =null;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
这种写法lazy loading很明显,但是致命的是在多线程不能正常工作,那么我们来进一步优化
public class Singleton {
private static Singleton instance =null;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
这种写法能够在多线程中很好的工作,而且看起来它也具备很好的lazy loading,但是效率很低,大多数情况下不需要同步,那么这种写法还需要进一步优化;
我们来分析下加锁的范围,是需要整个方法都要加锁还是某一个语句加锁就可以了,检测null和创建对象的分离的,如果两个操作能原子的操作那么就达到单例的效果,于是修改代码
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
return instance;
}
}
从代码上看之前是方法体同步,现在是方法内同步,但还是在调用getInstance()的时候立即同步,性能上没达到什么改进,那么如何进一步优化呢?我们可以想象如果instance==null 时我们在去同步会不好好一些呢,答案是肯定的,当实例生成后instance 就不空,此时判定instance == null 为false就不会进入同步。代码如下
public class Singleton {
private static Singleton instance = null;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
这就是double-checked locking设计实现单例模式。其实单例还有很多种写法,比如枚举、静态内部类等,在这里就不一一讲解,文笔不好勿喷...
分享到:
相关推荐
一个简单的java工程,包含注释,一目了然,其中包含了单例模式的所有实现方式,懒汉式,饿汉式,双重校验,枚举,静态内部类等方式实现单例。
Java 单例模式 懒汉模式 //懒汉式 多线程中不可以保证是一个对象
Java单例模式,其中:单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种
详细讲解了Java单例模式的几种实现方式,并有详细的示例配合讲解.
java单例模式开发的7中写法,网上搜索的,可以看看
作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 PPT详细了单例模式的实现和使用场景
java单例模式的例子java单例模式的例子java单例模式的例子
源码 博文链接:https://tianlihu.iteye.com/blog/747737
Java单例模式Java单例模式Java单例模式Java单例模式
java单例模式及实现
Java设计模式-单例模式(懒汉和恶汉)
这段代码实现了一个简单的日志记录器Logger,其中使用了Java的单例模式。在类的构造方法中,首先定义...这个简单的示例代码展示了如何使用Java单例模式来实现一个日志记录器的简单功能,方便了对日志数据的管理和记录。
java单例模式代码实例
java单例模式连接数据库源码.可以直接引用只需加入相应的mysql 或 oracle的驱动,修改源码的连接地址用户名及密码。
详解JAVA单例模式及多种实现
java单例模式
代码中演示了Java设计模式中的单例模式,其中包括饿汉单例模式,懒汉单例模式以及序列化饭序列化单例模式。在实际的开发中,可以直接借鉴使用。
非常详细的Java单例模式讲解的文档,请求通过,已经上传过一次了
【ASP.NET编程知识】java 单例模式(饿汉模式与懒汉模式).docx