设计模式(二):单例模式

来源:互联网 发布:直播游戏的软件 编辑:程序博客网 时间:2024/04/30 02:49
单例模式:用来创建只能有一个实例的对象。确保一个类只有一个实例,并提供一个全局访问点。

有的时候我们不希望一个类被创建出多个对象,因为多个实例会带来许多不好的影响。

经典单例模式:

public class SingleInstance {           private static SingleInstance instance;           private SingleInstance(){}           public static SingleInstance getInstance(){               if(instance == null){                   instance = new SingleInstance();           }               return instance;    }    ...........}

在类中定义静态变量记录类的唯一实例,然后定义一个私有的构造器,这样外部便无法实例化,再声明一个getInstance()方法实例化对象,并返回实例。

这样,当外部想实例化时,只需要调用SingleInstance.getInstance()方法便可获得唯一的实例。

 

但是上述经单例模式在处理多线程时还是会遇到错误,经常会被多个线程同时调用。

通过增加synchronized关键字到getInstnce()方法中,变成同步方法,就可以解决多线程问题。

但是同步方法会引发性能问题,每次都要同步这个方法,但事实上只要第一次同步即可。

所以最完善的办法便是采用 ”双重检查加锁“,在getInstance()方法中减少使用同步。

public class SingleInstance {      private volatile static SingleInstance instance;      private SingleInstance(){}      public static SingleInstance getInstance(){               if(instance == null){                   synchronized (SingleInstance.class) {                       if(instance == null){                           instance = new SingleInstance();                   }                }              }               return instance;          }}

private volatile static SingleInstance instance;

volatile关键词确保当instance变量被初始化成实例时,多个线程正确处理instance变量。

getInstance()方法只在第一次彻底执行全部代码。

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 拉大便后肛门痛怎么办 3岁宝宝肛裂怎么办 无臂人大便后怎么办 老婆移情别恋了怎么办 自己移情别恋了怎么办 嘴巴里破了变白怎么办 上嘴唇里面长泡怎么办 嘴皮里面长泡怎么办 嘴巴里经常长泡怎么办 嘴唇上长透明泡怎么办 嘴唇上长很多泡怎么办 嘴巴里长白色泡怎么办 做了漂唇起泡了怎么办 漂唇之后起泡了怎么办 漂唇后起了水泡怎么办 嘴唇起泡,弄破了怎么办 九个月的宝宝上火了怎么办 8岁儿童嘴唇起泡怎么办 宝宝嘴皮上火起泡了怎么办 上嘴唇起泡肿了怎么办 上嘴唇突然肿了怎么办? 醒来上嘴唇肿了怎么办 嘴巴突然肿了怎么办呢 下嘴唇肿起来了怎么办 上嘴唇肿了起泡怎么办 上火下嘴唇肿了怎么办 上火嘴唇都肿了怎么办 嘴唇起泡后肿了怎么办 嘴唇上有白点颗粒状怎么办 嘴唇缺了一块红怎么办 人得钩端螺旋体怎么办 脖子上有鸡皮肤怎么办 不结婚老了以后怎么办 丁克族老了怎么办知乎 2个月宝宝咳嗽怎么办 干活累的手疼怎么办 脸上长白色的癣怎么办 全身起红斑很痒怎么办 宝宝脖子红烂了怎么办 背上长红斑很痒怎么办 身上起风疙瘩很痒怎么办