当前位置: 代码迷 >> Java Web开发 >> 单例研讨
  详细解决方案

单例研讨

热度:257   发布时间:2016-04-16 21:55:46.0
单例探讨
单例内有其他公开方法,这样设计可以吗?
package com.zqgame.activity.db;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.Mongo;
import com.mongodb.MongoOptions;

/**
 * MongoDB 连接池管理
 * 
 * @author Kai.Zhao
 * @date Sept. 16th, 2014
 * @since 1.0
 */
public class MongoDB {

Logger log = LoggerFactory.getLogger(MongoDB.class);

private static Map<String, DB> dbMap;
private static Mongo mongo;

private MongoDB() {
dbMap = Collections.synchronizedMap(new HashMap<String, DB>());
}

private static MongoDB mongoDB;

public static MongoDB getInstance() {
if (mongoDB == null) {
synchronized (MongoDB.class) {
mongoDB = new MongoDB();
}
}
return mongoDB;
}

/**
 * 初始化Mongo
 * 
 * @param host 主机名 
 * @param port 端口
 * @param poolSize 连接数量
 * @param blockSize 等待队列长度
 * @throws Exception
 * @author Kai.Zhao
 * @since 1.0
 */
public synchronized void initMongo(String host, int port, int poolSize, int blockSize) {
try {
if (mongo == null) {
mongo = new Mongo(host, port);
MongoOptions options = mongo.getMongoOptions();
options.autoConnectRetry = true;
options.connectionsPerHost = poolSize;
options.threadsAllowedToBlockForConnectionMultiplier = blockSize;
}
log.info("Init Mongo {} [{}]", host, port);
} catch (Exception e) {
log.error("Init Mongo Error", e);
}
}

/**
 * 获取数据集合
 * 
 * @param dbname 库名
 * @param name 集合名
 * @return
 * @throws Exception
 * @author Kai.Zhao
 * @since 1.0
 */
public static DBCollection getCollection(String dbname, String name) throws Exception {
if (dbMap.containsKey(dbname)) {
return dbMap.get(dbname).getCollection(name);
}
DB db = mongo.getDB(dbname);
dbMap.put(dbname, db);
return db.getCollection(name);
}

}

------解决思路----------------------
同步块里还要再加个判断



if (mongoDB == null) {
            synchronized (MongoDB.class) {
                if (mongoDB == null) {
                        mongoDB = new MongoDB();
                }
            }
        }

------解决思路----------------------
用枚举来做单例
------解决思路----------------------
引用:
同步块里还要再加个判断



if (mongoDB == null) {
            synchronized (MongoDB.class) {
                if (mongoDB == null) {
                        mongoDB = new MongoDB();
                }
            }
        }


+1. 经典的单例模式啊。。
  相关解决方案