确保类只有一个实例,而且自行实例化并向整个系统提供这个实例
高并发时注意单例模式的线程同步问题,使用上面的通用代码不会产生线程同步问题。但是采用下面的代码就需要考虑线程同步
// 线程不安全的单例模式 代码2 public class Singleton { private static Singleton singleton = null; private Singleton() {} public static Singleton getSingleton() { if (singleton == null) singleton = new Singleton(); return singleton; } } 当线程A执行到singleton = new Singleton(),但还没有获得对象,对象初始化需要时间,线程B也执行到singleton == null,那么线程B获得判断条件为真。导致线程A,B分别获得一个对象,内存中存在两个对象。解决办法,在getSingleton方法前加synchronized关键字,称为懒汉式单例有上限的多例模式:要求一个类只产生两个对象
// 考虑到线程安全可用Vector代替ArrayList public class Emperor { // 定义最多产生几个实例数量 private static int maxNumOfEmperor = 2; // 每个皇帝都有名字,使用ArrayList来容纳,每个对象的私有属性 private static ArrayList<String> nameList = new ArrayList<String>(); // 定义一个列表,容纳所有的实例对象 private static ArrayList<Emperor> emperorList = new ArrayList<Emperor>(); // 当前皇帝的序号 private static int countNumOfmperor = 0; // 产生所有的对象 static { for (int i = 0; i < maxNumOfEmperor; i++) { emperorList.add(new Emperor("皇"+(i + 1)+"帝")); } } // 不允许外部代码实例化该类 private Emperor() {} // 传入皇帝名字,建立一个皇帝对象 private Emperor(String name) { nameList.add(name); } // 随机返回一个皇帝对象 public static Emperor getInstance() { Random random = new Random(); countNumOfmperor = random.nextInt(maxNumOfEmperor); return emperorList.get(countNumOfmperor); } // 皇帝发话 public static void say() { System.out.println(nameList.get(countNumOfmperor)); } }《设计模式之禅》