经验分享

面临大学的毕业,我和大多数毕业生一样,对这个世界是那么的迷茫和无知,如今找工作也快一个月了,依然任何的进展,北京这个地方固然美好,但是人才济济,Android市场的异常冷门让我雪上加霜,貌似我现在连一个实习生的资格都过不了,我是该好好反思自己的水平,不能再停留在原来那个阶段,下面我总结几个我考过的题型,也是为了分享一下记录自己的不足好去应对未来的挑战。

  • 实现一个单例模式代码

这道题虽然简单,但是埋下了一个坑,你是否考虑过在多线程的情况下,你得单例会不会产生多个对象呢? 还有效率问题呢?

  1. 下面是一个简单的单例,咱们看看会产生什么问题
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class A {
    //存放引用的变量
    private static A ins = null;
    //私有化构造方法
    private A() {}
    public static A getInstance(){
    if (ins == null){
    ins = new A();
    }
    return ins;
    }

实验效果:
效果图

哇,居然在高并发的情况下创建了两个!所以这种单例不严谨,会在高并发的情况下产生问题,我们来改进一下加入同步的内容。

2.修改上面的代码加入同步的内容

1
2
3
4
5
6
7
8
9
10
11
12
class A {
//存放引用的变量
private static A ins = null;
//私有化构造方法
private A() {}
public synchronized static A getInstance(){
if (ins == null){
ins = new A();
}
return ins;
}

实验效果图:
增加同步后的实验效果图

哇塞,达到了同步的效果,但是这里还需要注意一个问题就是,当我们在进行大量的并发的时候锁住了这个类以后是不是全部都需要进入锁判断了? 这样效率不就大大降低了么?所以这里我们还需要改进一下, 做到不多做一点的无用功。

3.修改上面的代码加入多层次判断快速创建对象,不多做一点无用功!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class A {
//存放引用的变量
private static A ins = null;
//私有化构造方法
private A() {}
```java
//加入同步
public static A getInstance() {
if (ins == null) {
synchronized (A.class){
if (ins == null){
ins = new A();
}
}
}
return ins;
}

这里就不展示效果图了,改进的是运行的速度,这里在首次创建对象的时候会进入锁判断,当创建完成以后,其他的都会直接返回对象,不再进入锁等待着中,大大的提高了运行的效率