首页 > 代码库 > 单例模式--两种方式

单例模式--两种方式

package com.factory;/* * 第一种方式创建单例 */class OneSingleton{    private static int number =0;       //私有属性    private static OneSingleton instance = new OneSingleton();  //OneSingleton的唯一实例    private OneSingleton(){}    public static OneSingleton getInstance(){        return instance;    }    public synchronized int getNumber(){    //synchronized关键字表示方法是线程同步        return number;                      //任一时刻最多只能有一个线程进入该方法    }    public synchronized int nextNumber(){        return number++;    }}/* * 第二种创建单例方法 */class TwoSingleton{    private static int number =0;    private static TwoSingleton instance = null;    private TwoSingleton(){}    public static synchronized TwoSingleton getInstance(){        if(instance == null){            instance = new TwoSingleton();        }        return instance;    }    public synchronized int getNumber(){        return number;    }    public synchronized int nextNumber(){        return number++;    }}/** * @function 单例模式 * @author JarCode * 技术要点: * 单例模式有两种实现方式: * >>一种是将类的 构造方法私有化,用一个私有的类变量instance保存类的实例, *在加载类时,创建类的实例,改方法直接返回instance. * >>另一种是将类的 构造方法私有化,用一个私有的类变量instance保存类的实例, *在加载类时,将null赋给instance,再提供一个公有的静态方法getInstance * ,用于获取类的唯一实例,该方法首先判断instance是否为null, *如果为null,则创建实例对象,否则返回instance。 * * 两种方式的区别: * >>前者被加载时,类的唯一实例被创建,后者在第一次调用getInstance()方法时,类的唯一实例被创建,但需要在getInstance()方法中使用synchronized * 关键字,保证某一时刻只有一个线程调用此方法。 * */public class TestSingleton {    public static void main(String[] args) {        OneSingleton one1 = OneSingleton.getInstance();        OneSingleton one2 = OneSingleton.getInstance();        System.out.println("用onsingleton实现单例模式");        System.out.println("调用nextnumber()方法之前:");        System.out.println("one1.number="+one1.getNumber());        System.out.println("one2.number="+one2.getNumber());        one1.nextNumber();        System.out.println("调用nextnumber()方法后:");        System.out.println("one1.number"+one1.getNumber());        System.out.println("one2.number"+one2.getNumber());                          TwoSingleton two1 = TwoSingleton.getInstance();        TwoSingleton two2 = TwoSingleton.getInstance();        System.out.println("用twosingleton实现单例模式");        System.out.println("抵用nextnumber方法之前:");        System.out.println("two1.number="+two1.getNumber());        System.out.println("two2.number="+two2.getNumber());        two1.nextNumber();        System.out.println("调用nextnumber方法后:");        System.out.println("two1.number="+two1.getNumber());        System.out.println("two2.number="+two2.getNumber());    }}

  

传自:http://www.oschina.net/code/snippet_1993928_43925

单例模式--两种方式