JAVA实现单例的几种方式

通过synchronized来实现

  1. synchronized加在方法上
  2. synchronized加在代码块上
public class MyObjectBySynchronized {

    private static MyObjectBySynchronized instance1;
    private static MyObjectBySynchronized instance2;
    
    /**
     * 锁整个方法实现单例
     * @return
     */
    public synchronized static MyObjectBySynchronized getInstance1() {
        if(instance1 == null) {
            instance1 = new MyObjectBySynchronized();
        }
        return instance1;
    }
    /**
     * 通过锁代码块+DCL双锁检锁机制实现懒汉模式单例
     * @return
     */
    public static MyObjectBySynchronized getInstance2() {
        if(instance2 == null) {
            synchronized (MyObjectBySynchronized.class) {
                if(instance2 == null) {
                    instance2 = new MyObjectBySynchronized();
                }
            }
        }
        return instance2;
    }
}

通过静态属性实现

public class MyObjectByStaticProperty {

    private static MyObjectByStaticProperty instance = new MyObjectByStaticProperty();
    
    public static MyObjectByStaticProperty getInstance() {
        return instance;
    }
}

通过静态代码块实现

public class MyObjectBystaticBlock {

    private static MyObjectBystaticBlock instance;
    
    static {
        instance = new MyObjectBystaticBlock();
    }
    
    public static MyObjectBystaticBlock getInstance() {
        return instance;
    }
}

利用枚举类的构造函数,在使用枚举类会自动调用来实现

public enum MyObjectSingleton {

    myObjectFactory;
    
    MyObject myObject;
    
    private MyObjectSingleton() {
        System.out.println("Enum类的构造函数在使用枚举时会自动调用,利用此方法来实现单例");
        myObject = new MyObject();//创建要实现单例的对象
    }
    /**
     * 获取对象
     * @return
     */
    public static MyObject getMyObject() {
        return myObjectFactory.myObject;
    }
}

通过内部静态类来实现

public class MyObject implements Serializable {
    private static final long serialVersionUID = 199079165697837232L;
    
    private static class MyObjectHandler{
        private static MyObject myObject = new MyObject();
    }
    private MyObject() {
        System.out.println("MyObject init ...");
    }
    
    public static MyObject getInstance() {
        return MyObjectHandler.myObject;
    }
    /**
     * 对于支持序列化的单例,为保证反序列化时为单例,需要此方法
     * @return
     * @throws ObjectStreamException
     */
    protected Object readResolve() throws ObjectStreamException{
        System.out.println("调用了 readResolve方法!!");
        return MyObjectHandler.myObject;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 整理来自互联网 1,JDK:Java Development Kit,java的开发和运行环境,java的开发工具...
    Ncompass阅读 5,422评论 0 6
  • 一:java概述: 1,JDK:Java Development Kit,java的开发和运行环境,java的开发...
    慕容小伟阅读 5,801评论 0 10
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 7,602评论 0 11
  • 接口/抽象类意义规范、扩展、回调为其子类提供一个公共的类型 封装子类中得重复内容 定义抽象方法,子类虽然有不同的实...
    MigrationUK阅读 6,572评论 1 28
  • 明天是儿子进入小学的第一天,今天尤其是下班后无所事事时,顿觉心里五味杂陈。时间就在不经意间一晃而过了,三年...
    一杯咖啡一卷书阅读 1,248评论 0 0