文档章节

单例模式

J
 J_Stone
发布于 2016/04/14 21:45
字数 407
阅读 6
收藏 0
public class _01_Singleton {
    public static void main(String[] args) {
        Singleton1 s1 = Singleton1.getInstance();
        Singleton1 s2 = Singleton1.getInstance();
        System.out.println(s1 == s2);

        //使用枚举
        Singleton5.INSTANCE.setName("zhangsan");
        System.out.println(Singleton5.INSTANCE.getName());
    }
}

//1 优点:简单,线程安全   缺点:非lazy的; 序列化会破坏单例
class Singleton1 {
    private static final Singleton1 singleton = new Singleton1(); //static不可缺少, 静态唯一

    private Singleton1() { //对外屏蔽构造函数
    }

    public static Singleton1 getInstance() { //对外获取实例的接口
        return singleton;
    }
}
//2 优点:线程安全, lazy加载 缺点:序列化会破坏单例, 复杂
class Singleton2 {
    private static volatile Singleton2 singleton;

    private Singleton2() {

    }
    public static Singleton2 getInstance() {
        if(singleton == null) {
            synchronized (Singleton2.class) {
                if(singleton == null) {
                    singleton = new Singleton2();
                }
            }
        }
        return singleton;
    }
}

//3 优点:简单,线程安全,lazy加载 缺点:序列化会破坏单例
class Singleton3  {
    private Singleton3(){

    }
    //Singleton实例放到一个静态内部类中,这样就避免了静态实例在Singleton类加载的时候就创建对象,
    // 并且由于静态内部类只会被加载一次,所以这种写法也是线程安全的
    private static class Holder {
        private static Singleton3 singleton = new Singleton3();
    }
    public static Singleton3 getInstance() {
        return Holder.singleton;
    }
}

//4 优点:简单,线程安全,lazy加载,序列化不破坏单例  缺点:自己处理序列化readResolve()函数
class Singleton4 implements Serializable{
    private Singleton4(){

    }
    private static class Holder {
        private static Singleton4 singleton = new Singleton4();
    }
    public Object readResolve() throws ObjectStreamException {
        return Holder.singleton;
    }
    public static Singleton4 getInstance() {
        return Holder.singleton;
    }
}
//5 使用枚举  优点:简单,java保证枚举类型的线程安全,防止反射强行调用构造器,提供了自动序列化机制,防止反序列化的时候创建新的对象
//推荐使用
enum Singleton5 {
    INSTANCE;

    String name;//操作 变量
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    //操作函数
    public void doWhatever() {
        //do
    }
}


© 著作权归作者所有

J
粉丝 2
博文 167
码字总数 30214
作品 0
朝阳
私信 提问

暂无文章

【在 Nervos CKB 上做开发】Nervos CKB 脚本编程简介[3]:自定义代币

原文作者:Xuejie 原文链接:https://xuejie.space/2019_09_06_introduction_to_ckb_script_programming_udt/ Nervos CKB 脚本编程简介[3]:自定义代币 CKB 的 Cell 模型和 VM 支持许多新的用...

NervosCommunity
48分钟前
4
0
通过OAuth2.0 获取授权访问SF 用户数据

通过OAuth2.0 获取授权访问SF 用户数据 OAuth2.0 相关知识 深入了解 Salesforce 中的 OAuth 2.0(SF官方) OAuth 2.0 的一个简单解释(阮一峰大神) OAuth 2.0 的四种方式(阮一峰大神) GitHub OA...

在山的那边
54分钟前
7
0
编写程序:从键盘上接受一个三位数(首先要确保是三位数),计算出各位之和输出。

#include<stdio.h> int main() { int a,sum=0; printf("请输入一个三位数:\n"); scanf("%d",&a); sum=a/100+a%100/10+a%10; printf("这三个数的和:%d",sum); return 0; }......

201905021729吴建森
今天
7
0
如何离开/退出/停用Python virtualenv

我正在使用virtualenv和virtualenvwrapper。 我可以使用workon命令在virtualenv之间切换。 me@mymachine:~$ workon env1(env1)me@mymachine:~$ workon env2(env2)me@mymachine:~$ workon e......

技术盛宴
今天
7
0
成长之路 万事坚持难

任何事情开了头,想要更好的发展下去,不忘初心,就一定要坚持下去。 以前自己坚持了一些事情,比如早睡不吃东西,由于中途断了,没有及时止损,导致又接着恶习断了几天。所以 及时的反省和调...

T型人才追梦者
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部