本文来看一看java设计模式之单例模式。

在打王者荣耀呢,遇到了一个很有意思的队友,你还想跟他再来几局solo下,看看谁才对得起万年偷塔韩跳跳的称号! 假设这个是你的队友吧。

1
2
3
4
5
6
7
8
package top.txiner.singleton;

public class Gamer {

    public void getInfo() {
        System.out.println("I am HanXin ");
    }
}

在伟大的王者峡谷召唤他!

1
2
3
4
5
6
7
8
package top.txiner.singleton;

public class Valley {
    public static void main(String[] args) {
        Gamer gamer=new Gamer();
        gamer.getInfo();
    }
}

这下我不用说也知道了,每次叫的不一定是他了,而是一个新的对象! 那怎么办?就不让他给分配新的对象了呗! 产生了新的对象就保存住!不再产生新的!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
package top.txiner.singleton;

public class Gamer {
    private static Gamer gamer=null;
    private Gamer(){}
    public static Gamer getInstance(){
        if (gamer==null){
            gamer=new Gamer();
        }
        return gamer;

    }
    public void getInfo() {
        System.out.println("I am HanXin ");
    }
}

很完美! 这下记录住了,以后跟你solo的一定就是你要的那个韩跳跳了! 突然,又一次,你发现就在你要跟这个韩跳跳玩的时候,就在系统创建的那万分之一秒的时候,又有一个玩家也要跟他挑战,以迅雷不及掩耳盗铃响叮当之势也创建了出来了。 也就是说

1
2
3
        if (gamer==null){
            gamer=new Gamer();
        }

你在执行

1
gamer=new Gamer();

还没创建好的时候,另一个人执行到了

1
if (gamer==null)

肯定也是对的,他也创建了一个! 完了,肯定不是一个人了! 一怒之下,在创建这个Gamer的时候就把对手韩信创建出来!

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package top.txiner.singleton;

public class Gamer {
    private static Gamer gamer=new Gamer();
    private Gamer(){}
    public static Gamer getInstance(){
        return gamer;

    }
    public void getInfo() {
        System.out.println("I am HanXin ");
    }
}

恩,世界太平了! -------------------分割线------------------- 实际上单例模式有很多中创建方案,包括本文中说过了懒汉模式,饿汉模式,还有静态内部类,枚举,双重校验锁等内容! 由于饿汉模式已经解决了内存不安全的问题,我就不再进行解释了!