码迷,mamicode.com
首页 > 其他好文 > 详细

【学习笔记】单例设计模式笔记

时间:2016-04-28 00:05:24      阅读:184      评论:0      收藏:0      [点我收藏+]

标签:

单例设计模式是常见的设计模式之一。通过单例实现所需求类在系统中只存在唯一一个实例。

单例设计模式分两种:懒汉单例设计模式和饿汉单例设计模式,两者设计思路一致,实现有微小不同。

实现代码:

1 public class HungryMan {
2     
3     private HungryMan(){};//私有的构造方法保证HungryMan类无法在外部使用构造方法实例化
4     private static final HungryMan hungryMan=new HungryMan();//在类内定义一个实例,这个是单例设计模式中保证的唯一的实现对象
5     public static HungryMan getInstance(){//定义一个静态方法获取唯一的实现对象
6         return hungryMan;
7     }
8 
9 }

 

在main中实现

1 public class Demo {
2 public static void main(String[] args) {
3 
4     HungryMan hungryMan=HungryMan.getInstance();
5     HungryMan hungryMan2=HungryMan.getInstance();
6     //HungryMan hungryMan3=new HungryMan(); 编译错误,因为构造方法不可见
7     System.out.println(hungryMan.equals(hungryMan2));//验证获得的两个实例是否为同一实例,结果为true
8 }
9 }

 

这是懒汉单例设计模式,最后一步验证了两个实例是否为同一实例。

 

 

饿汉单例设计模式:

 

 1 public class LazyMan {
 2 
 3     private LazyMan() {
 4     };
 5 
 6     private static LazyMan lazyMan;
 7 
 8     public static LazyMan getInstance() {//判断实例是否存在,存在直接返回,不存在则创建并初始化
 9         if (null == lazyMan) {
10             lazyMan = new LazyMan();
11         } 
12         return lazyMan;
13     }
14 
15 }

 

建议使用饿汉式的设计方式,因为上面的那种设计方式存在着线程安全问题,只有单个线程进行访问的时候是没有问题的,但是当有多个线程并发访问的时候,就会出现线程安全问题:可能会出现多次创建实例对象的情况(后面创建的实例会把前面创建的实例覆盖)。

线程安全问题:

 1 public class DemoThread extends Thread {
 2     @Override
 3     public void run() {
 4         LazyMan lazyMan = LazyMan.getInstance();
 5         /*
 6          * if (null == lazyMan) { //当到这一步的线程争夺中会出现安全问题
 7          * lazyMan = new LazyMan(); } 
 8          * return lazyMan;
 9          * 
10          */
11     }
12 }

 

在进入判断实例是否存在完成时,不同线程抢走执行权再次判断结果为true会造成创建多个lazyMan对象。

【学习笔记】单例设计模式笔记

标签:

原文地址:http://www.cnblogs.com/pizzabig/p/5440797.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!