首页 > 代码库 > JAVA学习(1):保证类的对象在内存中唯一

JAVA学习(1):保证类的对象在内存中唯一

一、饿汉式

class Single {    private static final Single s=new Single();    private Single(){}    public static Single getInstance()    {        return s;    }}

为什么方法是静态的:不能new对象却想调用类中方法,方法必然是静态的,静态方法只能调用静态成员,所以对象也是静态的。

为什么对象的访问修饰符是private,不能是public 吗?不能,如果访问修饰符是Public,则Single.s也可以得到该类对象,这样就造成了不可控。

二、懒汉式

class Single{    private static Single s=null;    private Single()    { 7     }    public static  Single getInstance()    {        if(s==null)        {            synchronized(Single.class)            {                if(s==null)                    s=new Single();                return s;            }        }        return s;    }}

假设我们现在并没有创建单例对象,即s==null,那么我们调用getInstance方法的时候,会进入if块,然后进入同步代码块,此时,别的线程如果想要创建Single实例,就必须获取锁;等当前线程创建完实例对象,释放锁之后,假设正巧有几个线程已经进入了if块中,它们会拿到锁,进入同步代码块,但是由于进行了判空操作,所以不会创建Single实例,而是直接返回已经创建好的Single实例。如果有多个其他线程进入了if块,当它们依次进入同步代码块的时候,同理也不会创建新的Single实例。而没有进入if块的线程,判空操作之后不满足条件,进不了if块,而直接执行了下一条语句return s;其后的线程调用getInstance方法时,只会判断一次s==null,不满足条件直接返回Single单例s,这样就大大提高了了执行效率。

 

转载: http://www.cnblogs.com/kuangdaoyizhimei/p/4000953.html

感谢(狂盗一枝梅)让我重新开始认识、学习

JAVA学习(1):保证类的对象在内存中唯一