单例模式

单例模式:当整个系统只需要一个实例对象时采用单例模式。
一开始加载类时就new MyClass()是饿汉式,当为null时才new MyClass()是懒汉式
非线程安全:

public class MyClass{
    private static MyClass instance;

    private MyClass(){
    }

    public static MyClass getInstance(){
        if(instance == null)
            instance = new MyClass();
        return instance;
    }
}

线程安全:

public class MyClass{
    private static MyClass instance;

    private MyClass(){
    }

    public static synchronized MyClass getInstance(){
        if(instance == null)
            instance = new MyClass();
        return instance;
    }

}
public class MyClass{ //饿汉式
    private static MyClass instance = new MyClass(); //类加载时完成初始化,jvm只分配一次,所有实例共享该静态变量

    private MyClass(){
    }

    public static MyClass getInstance(){
        return instance;
    }
}
public class MyClass{
    private volatile static MyClass instance; //保证可见性

    private MyClass(){
    }

    public static  MyClass getInstance(){
        if(instance == null){ 
            synchronized(MyClass.class){ //对类进行同步,在new MyClass之前再检查一下是否为空
                if(instance == null){
                    instance = new MyClass();
                }
            }
        }
        return instance;
    }
}

单元素的枚举类型:

public Enum MyClass{
    INSTANCE;//定义一个枚举元素,就相当是定义一个MyClass实例

    public void printMsg(){
    }

}

调用方式:MyClass.INSTANCE.printMsg()

1.5以前的做法是:
public class MyClass{
private static final MyClass instance = new MyClass();

private MyClass(){
}

public static MyClass getInstance(){
    return instance;
}

}

对于单例的序列化,除了要implement serializable之外,所有域要声明为transient并提供readResolve方法(from Effective Java)

private Object readResolve(){
    return instance;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值