单例模式的懒加载(转)

首先推荐种最好的单例模式实现方式(没有之一)

[java]  view plain  copy
  1. public class Manager {  
  2.   
  3.     private Manager() {  
  4.           
  5.     }  
  6.       
  7.     public static Manager getInstance() {  
  8.         return ManagerHolder.instance;  
  9.     }  
  10.       
  11.     private static class ManagerHolder {  
  12.         private static final Manager instance = new Manager();  
  13.     }  
  14. }  

然后解释下为什么要用这种方式:

内部类只在需要的时候才会被类加载器加载,实现了懒加载,即在需要的时候才实例化出一个Manager,而且是唯一的一个

* 同时由于instance是static final类型,保证了内存中只有这样一个实例存在,而且只能被赋值一次,从而保证了线程安全性

(即使在高并发的情况下多个线程同时访问getInstance()方法 也能够保证实例的唯一性)

其他没有采用内部类的实现方式 以下是目前见过最好的:

[java]  view plain  copy
  1. public static class SingletonOptimizeLazy {  
  2.     static SingletonOptimizeLazy instance = null;  
  3.     public static SingletonOptimizeLazy getInstance() {  
  4.       if (instance == null) {  
  5.         createInstance();  
  6.       }  
  7.       return instance;  
  8.     }  
  9.     private synchronized static SingletonOptimizeLazy createInstance() {  
  10.       if (instance == null) {  
  11.         instance = new SingletonOptimizeLazy();  
  12.       }  
  13.       return instance;  
  14.     }  
  15. }  

以上这种解决方式 主要思想是将实例化的过程抽象出来 放在一个sychronized方法中执行 这样也能够实现懒加载与并发安全

不过仍然推荐使用内部类的解决方案


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值