单例模式 分为 饿汉模式 和 懒汉模式。
饿汉模式 : 是在 启动时 就加载, 懒汉模式 是 创建实例时 才加载。
单例模式 有以下特点:
1、单例类 只能有一个实例。
2、单例类 必须自己创建自己的唯一实例。
3、单例类 必须给所有其他对象提供这一实例。
典型代码如下 :
- //懒汉式单例类.在第一次调用的时候实例化自己
- public class Singleton {
- private Singleton() {}
- private static Singleton single=null;
- //静态工厂方法
- public static Singleton getInstance() {
- if (single == null) {
- single = new Singleton();
- }
- return single;
- }
- }
很多工程 为了 实现单例模式 在工程启动时 就加载,写成如下形式(在构造方法中,加上初始化方法,是工程启动时就把数据加载到缓存类):
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();
}
}