java 之 单例模式

单例模式 分为 饿汉模式 和 懒汉模式。

饿汉模式 : 是在 启动时 就加载, 懒汉模式 是 创建实例时 才加载。

单例模式 有以下特点:
  1、单例类 只能有一个实例。
  2、单例类 必须自己创建自己的唯一实例。
  3、单例类 必须给所有其他对象提供这一实例。


典型代码如下 : 


  1. //懒汉式单例类.在第一次调用的时候实例化自己   
  2. public class Singleton {  
  3.     private Singleton() {}  
  4.     private static Singleton single=null;  
  5.     //静态工厂方法   
  6.     public static Singleton getInstance() {  
  7.          if (single == null) {    
  8.              single = new Singleton();  
  9.          }    
  10.         return single;  
  11.     }  
  12. }  


很多工程 为了 实现单例模式 在工程启动时 就加载,写成如下形式(在构造方法中,加上初始化方法,是工程启动时就把数据加载到缓存类):

public class BranchCache {

private BranchCache() {
init();
}
   //构造函数 用private修饰,防止外部类 构造该种实例。通过单例类提供的方法创建实例


public static BranchCache getInstance() {
return cacheobj;
}

/**
* 初始化
*/
private void init() {
IDBSession session = null;
try {
branchMap.clear();
branchNoList.clear();
idNoMap.clear();
session = DBSessionFactory.getNewSession();
List<Branch> list = session.getObjectList(
"select * from tbbranch order by branch_level,branch_no",
Branch.class);
for (int i = 0; i < list.size(); i++) {
Branch branchObj = list.get(i);
String branchNo = branchObj.getBranchNo();
branchMap.put(branchNo, branchObj);
this.idNoMap.put(branchObj.getInternalBranch(),branchNo);
this.branchNoList.add(branchNo);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
DBSessionFactory.closeSession(session);
} catch (Exception e2) {
e2.printStackTrace();
}
}
}

}


// 注意 : 对缓存的读取,修改,刷新等操作 需要加锁,因为可能存在 刷新等操作。 一旦刷新的时候,做了读取操作,可能存在 数据库中,有数据但是在 缓存中取不到的情况。

public Branch getBranch(String branchNo) {
try {
r.lock();
return branchMap.get(branchNo);
}finally {
r.unlock();
}
}


public void refresh() {
try {
w.lock();
init();
} finally {
w.unlock();
}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值