java设计模式之----单例模式
2018-03-25 15:51
211 查看
(一) 单利设计模式:
保证只有一个实例,并提供一个访问它的全局访问点.
优点:
A,只有一个实例,避免了频繁创建个销毁对象,提高性能.
B,防止其他对象对自己的实例化,确保所有对象都访问这一个实例.
缺点:
A,没有抽象层,扩展优点困难.
适用场景:
A.需要频繁实例化然后销毁的对象。
B.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
C.有状态的工具类对象。
D.频繁访问数据库或文件的对象。
1,饿汉式:
避免了多线程的同步问题,但在类的加载时就完成初始化,类加载较慢,而且没有达到懒加载的效果,会造成内存浪费.不推荐public class Singleleton {
private static Singleleton instance = new Singleleton();
public Singleleton( ) {}
public static Singleleton getInstance() {
return instance;
}
}
2,懒汉式:
在第一次调用时初始化,虽然节约了资源,但线程不安全.不推荐 public class Singleleton {
private static Singleleton instance;
public Singleleton() {}
public static Singleleton getInstance() {
if(instance == null) {
instance = new Singleleton();
}
return instance;
}
}
3,懒汉式加锁:
线程安全,但每个调用getInstance()方法都要同步,造成不必要的同步开销.不推荐public class Singleleton {private static Singleleton instance;
public Singleleton() {}
public static synchronized Singleleton getInstance() {
if (instance == null) {
instance = new Singleleton();
}
return instance;
}
4,双重检查锁:
两次判空,第一次是为了不必要的同步,第二次是在Singleton为null时创建,效率高,资源利用率高.
虽然使用了volatile会影响一点性能,但考虑程序的正确性,牺牲这点值得.
解决了线程安全,资源消耗和多余同步的问题,但有时候会出现失效的问题.也不怎么推荐 private static volatile Singleleton instance;
public Singleleton() {}
public static Singleleton getInstance() {
if (instance == null) {
synchronized (Singleleton.class) {
if(instance == null) {
instance = new Singleleton();
}
}
}
return instance;
}
}
5,静态内部类:
第一次加载Singleton类是不会初始化,只有在第一次调用getInstance()方法时,虚拟机才加载SingletonHolder并初始化.
确保了线程安全,也能解决Singleleton唯一性.
推荐使用这种模式.
public Singleleton(){}
public static Singleleton getInstance() {
return SingleletonHolder.instance;
}
public static class SingleletonHolder {
private static final Singleleton instance = new Singleleton();
}
6,枚举:
因为在开发中很少用,可读性不高,自己也不太会,就不介绍了.
保证只有一个实例,并提供一个访问它的全局访问点.
优点:
A,只有一个实例,避免了频繁创建个销毁对象,提高性能.
B,防止其他对象对自己的实例化,确保所有对象都访问这一个实例.
缺点:
A,没有抽象层,扩展优点困难.
适用场景:
A.需要频繁实例化然后销毁的对象。
B.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。
C.有状态的工具类对象。
D.频繁访问数据库或文件的对象。
1,饿汉式:
避免了多线程的同步问题,但在类的加载时就完成初始化,类加载较慢,而且没有达到懒加载的效果,会造成内存浪费.不推荐public class Singleleton {
private static Singleleton instance = new Singleleton();
public Singleleton( ) {}
public static Singleleton getInstance() {
return instance;
}
}
2,懒汉式:
在第一次调用时初始化,虽然节约了资源,但线程不安全.不推荐 public class Singleleton {
private static Singleleton instance;
public Singleleton() {}
public static Singleleton getInstance() {
if(instance == null) {
instance = new Singleleton();
}
return instance;
}
}
3,懒汉式加锁:
线程安全,但每个调用getInstance()方法都要同步,造成不必要的同步开销.不推荐public class Singleleton {private static Singleleton instance;
public Singleleton() {}
public static synchronized Singleleton getInstance() {
if (instance == null) {
instance = new Singleleton();
}
return instance;
}
4,双重检查锁:
两次判空,第一次是为了不必要的同步,第二次是在Singleton为null时创建,效率高,资源利用率高.
虽然使用了volatile会影响一点性能,但考虑程序的正确性,牺牲这点值得.
解决了线程安全,资源消耗和多余同步的问题,但有时候会出现失效的问题.也不怎么推荐 private static volatile Singleleton instance;
public Singleleton() {}
public static Singleleton getInstance() {
if (instance == null) {
synchronized (Singleleton.class) {
if(instance == null) {
instance = new Singleleton();
}
}
}
return instance;
}
}
5,静态内部类:
第一次加载Singleton类是不会初始化,只有在第一次调用getInstance()方法时,虚拟机才加载SingletonHolder并初始化.
确保了线程安全,也能解决Singleleton唯一性.
推荐使用这种模式.
public Singleleton(){}
public static Singleleton getInstance() {
return SingleletonHolder.instance;
}
public static class SingleletonHolder {
private static final Singleleton instance = new Singleleton();
}
6,枚举:
因为在开发中很少用,可读性不高,自己也不太会,就不介绍了.
相关文章推荐
- 学习:java设计模式—工厂模式
- java设计模式 之 抽象工厂模式
- java设计模式之----工厂模式
- Java设计模式学习记录-享元模式
- Java设计模式-DAO( Data Access Object)
- JAVA设计模式学习第二天 设计模式之Factory——买货篇
- Java设计模式 -- 观察者模式(pull方式)
- Java设计模式之《适配器模式》及应用场景
- Java学习日志(19-2-IO流-装饰设计模式与LineNumberReader)
- java设计模式(行为型)之备忘录模式
- Java设计模式(13)——结构型模式之桥梁模式(Bridge)
- java中的23种设计模式
- Java设计模式透析之 —— 模板方法(Template Method)
- 【JAVA设计模式-第一课】面向对象特性及原则回顾
- 深入浅出Java开发中的23种设计模式详解
- 追MM和Java的23种设计模式
- java 设计模式之工厂模式与反射的结合
- java设计模式之代理模式
- java设计模式_外观模式
- [转]从追MM谈JAVA的23种设计模式