首页 > 代码库 > 单例模式
单例模式
定义:确保某一个类只有一个实例,并且自行实例化并向整个系统提供这个实例。
饿汉式单例
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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。