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;
	}

}

发布了125 篇原创文章 · 获赞 53 · 访问量 8万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 数字20 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览