Java从零开始

Java19单例模式

2016-11-25  本文已影响7人  chad_it

通过某个类创建对象时,在整个程序中,只能创建一个对象,这种类称为单例类。

饿汉式(类一旦加载,单例就初始化完成,保证调用getInstance的时候,单例已经存在)

单例类会一直占用资源

package com.javawu.singleton;
public class Singleton{

    private static Singleton singleton= new Singleton();
    
    private Singleton() {
        
    }
    
    public static Singleton getInstance() {
        return singleton;
    }
}

懒汉式(延迟加载,调用getInstance的时候才回去初始化这个单例)

package com.javawu.singleton;

public class Singleton{
#2.声明类的静态变量(静态变量跟对象无关)
    private static Singleton singleton = null;
    
#1.使用private修饰默认的构造方法(类外部不能使用new创建对象)
    private Singleton () {
        // TODO 自动生成的构造函数存根
    }
#3.创建返回对象的方法
#4.判断,对象存在不再创建
#5.(1)为了保证线程同步,改为同步方法(每次调用都会做线程同步)
    public static synchronized Singleton getInstance() {
        if(singleton == null) {
            singleton = new Singleton ();
        }
        return singleton;
    }
#5.(2)双重检查锁定(和1相比只有第一次调用单例的时候才会做线程同步)
//使用双重检查锁定,signleton需要用volatile修饰
//即 private volatile static Singleton sigleton = null;
//详见:http://www.iteye.com/topic/652440
    public static Singleton getInstance() {
        if(singleton == null) {
            synchronized(Singleton.class) {
                if(singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
#5.(3)静态内部类(3种延迟加载方式中最优的)
    public static Singleton getInstance() {
        private static class Holder {
            private static final Singleton instance = new Singleton();
        }
        private Singleton() {
        }
        public static final Singleton getInstance() {
            return Holder.instance;
        }
    }
}

据称还有一个最佳的单例实现方法--单个成员的枚举

package com.javawu.singleton;

public enum Singleton {
    //定义一个枚举元素
    instacnce;
    //这个单例类具有的方法
    public void method() {
        
    }
}
上一篇 下一篇

猜你喜欢

热点阅读