Java 设计模式01 单例模式
1 单例模式 简介
1.1 优点
(1) 在内存中只有一个对象,节省内存空间。
(2) 避免频繁的创建销毁对象,可以提高性能。
(3) 避免对共享资源的多重占用,简化访问。
(4) 为整个系统提供一个全局访问点。
1.2 缺点
(1) 不适用于变化频繁的对象。
(2) 在某些方面滥用单例将带来一些负面问题,比如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出。
(3) 如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失。
2 单例模式 UML 图
TODO:
3 单例模式 实现
3.1 单例模式—饿汉模式
优点:饿汉模式在类装载的时候就完成实例化。完全避免了线程同步问题。
缺点:在类装载的时候就完成实例化,没有达到 Lazy Loading 的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。
package com.xu.modle;
/**
* @ClassName: Modle
* @Description: java 单例模式
* @author Administrator
* @date 2019年9月28日
*
*/
public class Modle {
private static Modle modle = new Modle();
private Modle() {
System.out.println("单例模式---饿汉模式");
}
public static Modle getModle() {
return modle;
}
}
3.2 单例模式—懒汉模式 (非线程安全)
优点:达到饿汉模式没有时间 Lazy Loading 的效果。
缺点:在多线程的时候因为没有加 synchronized 在多线程并发的情况下可能出现多单例模式被多次实例化,而没有达到单例模式所有的效果。
package com.xu.modle;
/**
* @ClassName: Modle
* @Description: java 单例模式
* @author Administrator
* @date 2019年9月28日
*
*/
public class Modle {
private static Modle modle;
private Modle() {
System.out.println("单例模式---懒汉模式 (非线程安全)");
}
public static Modle getModle() {
if (modle==null) {
modle = new Modle();
}
return modle;
}
}
3.3 单例模式—懒汉模式 (线程安全)
优点:达到饿汉模式没有时间 Lazy Loading 的效果,且线程安全。
缺点:synchronized 为独占排他锁,并发性能差。即使在创建成功以后,获取实例仍然是串行化操作。
package com.xu.modle;
/**
* @ClassName: Modle
* @Description: java 单例模式
* @author Administrator
* @date 2019年9月28日
*
*/
public class Modle {
private static Modle modle;
private Modle() {
System.out.println("单例模式---懒汉模式 (线程安全)");
}
public static synchronized Modle getModle() {
if (modle==null) {
modle = new Modle();
}
return modle;
}
}
3.4 单例模式—懒汉模式 (双重加锁检查DCL)
优点:线程安全;延迟加载;效率较高。
缺点:实例必须有 volatile 关键字修饰,其保证初始化完全,比较麻烦。
package com.xu.modle;
/**
* @ClassName: Modle
* @Description: java 单例模式
* @author Administrator
* @date 2019年9月28日
*
*/
public class Modle {
private static Modle modle;
private Modle() {
System.out.println("单例模式---懒汉模式 (双重加锁检查DCL)");
}
public static Modle getModle() {
if (modle==null) {
synchronized(Modle.class) {
if (modle==null) {
modle = new Modle();
}
}
}
return modle;
}
}
3.5 单例模式—静态内部内模式 (推荐)
优点:由JVM保证线程安全,推荐。
package com.xu.modle;
/**
* @ClassName: Modle
* @Description: java 单例模式
* @author Administrator
* @date 2019年9月28日
*
*/
public class Modle {
private static class SingletonHolder{
private static Modle modle = new Modle();
}
private Modle() {
System.out.println("单例模式---静态内部内模式");
}
public static Modle getModle() {
return SingletonHolder.modle;
}
}