现在的位置: 首页 > 综合 > 正文

黑马程序员一单例设计模式的饿汉式与懒汉式以及加锁的情况

2018年05月23日 ⁄ 综合 ⁄ 共 1016字 ⁄ 字号 评论关闭

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

首先,我们以类Single为例,做一个单例设计模式

一个类在内存中只有一个对象,只操作一个对象,所以该类只会提供一个获得对象的方法,

返回值类型为类类型,返回的内容为对象

//同步函数被静态修饰后,用的锁synchronized是this
//静态进内存中,没有本类对象,但是有该类对应的字节码文件对象     类.class

饿汉式

所谓饿汉式,在代码块初始化的时候,就会生成一个对象,

并且向外提供一个公有的方法,直接返回太对象。

由于方法语句只有一句,所以不存在锁的情况

class Single

{
private Singel(){}
private static  Singel s=new Singel();
public static Singel getInstance()
{
return s;
}
}

懒汉式

所谓懒汉式,就是在初始化的时候并不给该类对象赋值属性,为null.

只用当调用该方法时,进行判断如果值为null,则新建一个内存对象赋值给该对象,返回该对象

否则则认为该对象以存在,返回原来的对象,确保对象的唯一性。

class Single

{

private static  Single s=null;

private Single(){}

public static  Single getInstance()
{
if(s==null)

s=new Single();
}
return s;
}
}

懒汉式的加锁情况

由于懒汉式为多行语句,所以在线程运行中可能会造成中断,生成多个对象的情况。

为了提高代码的高效性,所以进行了加锁以及双重判断的情况

第一重判断,为当不存在该对象时,则增加加锁代码块,保证代码块中语句不中断

第二重判断,如果对象值为null,新建这个对象,提高代码的高效性。

class Single

{
private static  Single s=null;
private Single(){}
public static  Single getInstance()
{
if(s==null)

synchronized(Single.class)

{

if(s==null)

s=new Single();
}
}
return s;
}
}

抱歉!评论已关闭.