//懒汉
class LazySingleton{
private static LazySingleton singleton;
private LazySingleton(){
}
public static LazySingleton getInstance(){
synchronized(this){
if(singleton==null){
singleton=new LazySingleton();
}
return singleton;
}
}
}
//恶汉
class HungrySingleton{
private static HungrySingleton singleton=new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance(){
return singleton;
}
}
//双重校验锁
class LockSingleton{
private volatile static LockSingleton singleton;
private LockSingleton(){}
public static LockSingleton getInstance(){
if(singleton==null){
synchronized(LockSingleton.class){
if(singleton==null){
singleton=new LockSingleton();
}
}
}
return singleton;
}
}
//静态内部类
public class Singleton {
private Singleton(){
if(SigletonHolder.instance!=null){
throw new AssertionError();
}
}
private static class SigletonHolder {
private static final Singleton instance = new Singleton();
}
public static final Singleton getInstance() {
return SigletonHolder.instance;
}
}
//枚举
public enum Singleton {
instance; // 定义一个枚举的元素,就代表Singleton的一个实例
public void doSomeThing(){
}
}
总结:五类:懒汉,恶汉,双重校验锁,静态内部类,枚举。
恶汉:因为加载类的时候就创建实例,所以线程安全(多个ClassLoader存在时例外)。缺点是不能延时加载。
懒汉:需要加锁才能实现多线程同步,但是效率会降低。优点是延时加载。
双重校验锁:麻烦,在当前Java内存模型中不一定都管用,某些平台和编译器甚至是错误的,因为instance = new MaYun()这种代码在不同编译器上的行为和实现方式不可预知。
静态内部类:延迟加载,减少内存开销。因为用到的时候才加载,避免了静态field在单例类加载时即进入到堆内存的permanent代而永远得不到回收的缺点(大多数垃圾回收算法是这样)。
枚举:很好,不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。但是失去了类的一些特性,没有延迟加载。
注:
双重校验所问题:JAVA内存模型一些原因偶尔会失败,内存模型允许所谓的“无序写入”,这是失败的一个主要原因,初始化实例的写入操作和实例字段的写入操作能够被编译器或者缓冲区重排序,重排序可能会导致返回部分构造的一些东西。在JDK1.5新的内存模型下,实例字段使用volatile可以解决双重锁检查的问题,因为在构造线程来初始化一些东西和读取线程返回它的值之间有happens-before关系。
防止反序列化:重写readResolve()接口,直接返回当前实例。
防止反射:私有构造器中添加非空逻辑判断和throw new AssertionError();
分享到:
相关推荐
Java设计模式-单例模式详解
java设计模式之单例模式详解,包含例子,详解。
java单例模式详解 简单代码实现2中单例模式 有详细的文字说明。
java单例模式详解Java系列2021.pdf
单例设计模式: 1、构造函数私有 2、定义类型为本身类型的成员 3、类中提供一个公共的并且静态的获取本类实例的方法
1、掌握单例模式的应用场景。 2、掌握 IDEA 环境下的多线程调试方式。 3、掌握保证线程安全的单例模式策略。 4、掌握反射暴力攻击单例解决方案及原理分析。 5、序列化破坏单例的原理及解决方案。 6、掌握常见的...
Java设计模式-单例模式详解,包含三种模式式:饿汉,懒汉,登记式,以及线程多同步的处理
本文实例讲述了JavaScript设计模式—单例模式.分享给大家供大家参考,具体如下: 单例模式也称为单体模式,其中: 1,单体模式用于创建命名空间,将系列关联的属性和方法组织成一个逻辑单元,减少全局变量。 逻辑...
4种单例模式及详解
【课堂笔记】单例模式详解
主要介绍了9种Java单例模式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
今天小编就为大家分享一篇关于Java双重检查加锁单例模式的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
java 单例模式和工厂模式实例详解.docx
在Java中有很多模式,例如MVC啊等等,这些模式都很重要,所以我做出了一些归纳
详解JAVA单例模式及多种实现
主要介绍了java 单例模式的实例详解的相关资料,希望通过本文能帮助大家彻底理解掌握这部分内容,需要的朋友可以参考下
Java后端资源
单例模式详解
主要给大家介绍了关于Java中四种单例模式的相关资料,其中包括饿汉式、懒汉式、懒汉式(双重锁)及内部类等四种,分别给出了详细的示例代码和介绍,需要的朋友们下面来一起看看吧。