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

单例模式

时间:2014-07-01 11:51:36      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   使用   问题   for   

定义:确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。

 

 

 

饿汉式单例

 1 public class A{
 2     
 3     private static final A a= new A();
 4     
 5     private A(){};
 6     
 7     public static A getInstance(){
 8         return a;
 9     }
10     
11 }

 

 我们通常会用下面的格式定义一个单例:线程不安全单例

 1 public class B {
 2 
 3     private static B b = null;
 4     
 5     private B(){};
 6     
 7     public static B getInstance(){    
 8         if (b == null) {
 9             b = new B(); // 如果线程A执行到次行,但还没有获取到对象,这时第二个线程B也在执行,执行到(b == null)判断,那么线程B获得的条件为真,于是继续运行下去,这样线程A和B各自获得了一个对象,在内存中就会出现两个对象!
10         }            
11         return b;
12     }
13     
14 }

 

解决线程安全的方法很多,可以在getInstance方法前加synchronized关键字,也可以在getInstance方法内增加synchronized来实现,但都不是最优秀的单例模式,建议使用“饿汉式单例”!

 

懒汉式单例(加入了synchronized)

 1 public class B {
 2 
 3     private static B b = null;
 4     
 5     private B(){};
 6     
 7     public static synchronized B getInstance(){
 8         if (b == null) {
 9         }            b = new B();
10 
11         return b;
12     }
13     
14 }

 

有上限多例:方便系统扩展,修正单例可能存在的性能问题,提供系统响应速度

 1 public class C {
 2 
 3     /**
 4      * 上限数量
 5      */
 6     private static final int MAX = 2;
 7     
 8     /**
 9      * C对象的“名字”list
10      */
11     private static List<String> names = new ArrayList<String>();
12     
13     /**
14      * C对象list
15      */
16     private static List<C> models = new ArrayList<C>();
17     
18     /**
19      * 当前序列号
20      */
21     private static int curNum = 0;
22     
23     
24     static {
25         for (int i = 0; i < MAX; i++) {
26             models.add(new C("C对象" + i));
27         }
28     }
29     
30     private C() {
31     }
32 
33     /**
34      * 建立一个带"名字"的C对象
35      * @param name
36      */
37     private C(String name){
38         names.add(name);
39     }
40     
41     public static C getInstance(){
42         Random random = new Random();
43         
44         curNum = random.nextInt(MAX);
45         
46         return models.get(curNum);
47     }
48     
49     public void say(){
50         System.out.println(names.get(curNum));
51     }
52     
53 }
 1 public class Main {
 2 
 3     public static void main(String[] args) {
 4         int max = 5;
 5         for (int i = 0; i < max; i++) {
 6             System.out.print("第" + i + "个C对象:");
 7             C.getInstance().say();
 8         }
 9     }
10     
11 }

 

单例模式,布布扣,bubuko.com

单例模式

标签:style   blog   color   使用   问题   for   

原文地址:http://www.cnblogs.com/maxinliang/p/3817521.html

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