A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sxsxsx 中级黑马   /  2015-5-18 23:23  /  432 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

ex1:



public class Singleton   
{   
    private static final Singleton singleton = null;   
   
    private Singleton()   
    {   
    }   
    public static Singleton getInstance()   
    {   
        if (singleton== null)   
        {   
            singleton= new Singleton();   
        }   
        return singleton;   
    }   
}   




这个不多说了,肯定是错误的,如果多个线程访问的时候都死==null,那么接下来就是产生多个实例。不算单例模式。



ex2:



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

这个虽然加了同步锁,但是如果多个线程同步访问==null,那么还是会产生多个实例,只是产生实例的时候同步而已。



ex3:





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



这个就可以了,但是这个地方对于每个访问的这个方法都是同步,而最需要的同步只是在new的地方,所以这样做虽然保证了单例,但是效率有点低哦。



ex4:



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



这个不错,保证了单例。这个叫做double-check 双重检查。



还有一个比较简单的写法。



ex5:



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

这样也可以,具体2种差别就不多说了。下面这个看起来要简单好多的哈

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马