一. 定义
单例模式确保一个类只有一个实例,并提供全局访问点。
二. 模式起源
三. 设计原则
四. UML图
五. 代码
5.1 饿汉式
package model.single;
/**
* 饿汉式
*/
public class StarvingSingleton {
private static StarvingSingleton instance = new StarvingSingleton();
private StarvingSingleton() {
}
public static StarvingSingleton getInstance() {
return instance;
}
}
5.2 懒汉式
package model.single;
/**
* 懒汉式: 单线程下安全 多线程环境下new LazySingleton()会产生多个实例
*/
public class LazySingleton {
private static LazySingleton instance = null;
private LazySingleton() {
}
public static LazySingleton getInstance() {
// 此处多线程环境下会创建多个实例 存在安全隐患
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
5.3 同步方法懒汉式
package model.single;
/**
* 同步方法式: 多线程安全,但是效率低
*/
public class SyncSingleton {
private static SyncSingleton instance = null;
private SyncSingleton() {
}
public static synchronized SyncSingleton getInstance() {
if (instance == null) {
instance = new SyncSingleton();
}
return instance;
}
}
5.4 双重检查锁懒汉式
package model.single;
/**
* 双重检查锁模式
*/
public class DclSyncSingleton {
// volatile关键字确保: 当instance变量被初始化为DclSyncSingleton实例时,多个线程正确处理该变量
private volatile static DclSyncSingleton instance = null;
private DclSyncSingleton() {
}
public static DclSyncSingleton getInstance() {
if (null == instance) {
synchronized (DclSyncSingleton.class) {
if (null == instance) {
instance = new DclSyncSingleton();
}
}
}
return instance;
}
}
5.5 静态内部类式
package model.single;
/**
* 静态内部类式
*/
public class InnerClassSingleton {
private InnerClassSingleton() {
}
/**
* 内部类:持有一个静态私有的类对象
*/
private static class LayHolder {
private static InnerClassSingleton INSTANCE = new InnerClassSingleton();
}
public static InnerClassSingleton getInstance() {
return LayHolder.INSTANCE;
}
}
六. 感悟
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/17808.html