首页 > 代码库 > 单例模式

单例模式

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

 

 

 

饿汉式单例

 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对象的“名字”list10      */11     private static List<String> names = new ArrayList<String>();12     13     /**14      * C对象list15      */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 name36      */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 }