对于单例模式的理解
单例模式指的是一个类只会有一个实例,即是instance,java web中Servlet就是单实例多线程的,单实例运用场景很多,例如在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例,单例的好处:节省内存,不需要new出来那么多实例;配合线程同步;单例一般用于公共资源;
举个例子:网页点击量通常设置成单例模式,一个静态全局变量用来计数,单例模式用于控制这个全局变量的访问,用同步锁住计数器来计数;
单例模式主要有3个特点,:
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;
}
}
举个工程中单例多线程的例子:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ibm.ecif.framework.db.DataSource;
/**
* 配置管理,主要对模拟交易模块的模拟文件名的管理
*
* @author djw
* @version 1.0 2014-10-26
*/
public class DBConfigManager {
private static Logger log = LoggerFactory.getLogger(DBConfigManager.class);
private static Timestamp cts = null;
// Singleton implementation function.
private static DBConfigManager theInstance = null;
// Config file properties
private Map<String, String> theProperties = new HashMap<String, String>();
/**
* Default Constructer
*/
private DBConfigManager() {
super();
} /* ConfigManager() */
/**
* Return the reference instance of the config manager Use this in
* preference to the singleton APIs.
*
* @return an instance of ConfigManager
*/
public static synchronized DBConfigManager getInstance() {
if (theInstance == null) {
theInstance = new DBConfigManager();
theInstance.init();
}
return theInstance;
} /* getInstance() */
public void init() {
// theInstance.theProperties.clear();
Connection conn = null;
// int m = 0;
// int m2 = 0;
// try {
// m = JedisConfigMgr.hlen(Framework.getJedisNS() +
// CacheCode.PARTY_IDFY_HASHCODE);
// m2 = JedisConfigMgr.hlen(Framework.getJedisNS() +
// CacheCode.CUST_NUM);
// } catch (RuntimeException e) {
// return;
// }
// if (m>0||m2>0) {
// return;
// }
//
PreparedStatement stmt = null;
ResultSet rs = null;
try {
// 初始化CUST_NUM缓存
conn = DataSource.getConnection();
String sql = "select key, value from TB9005";
stmt = conn.prepareStatement(sql);
rs = stmt.executeQuery();
Map<String, String> map = new HashMap<String, String>();
while (rs.next()) {
String key = rs.getString("key").trim();
String value = rs.getString("value").trim();
map.put(key, value);
}
theProperties = map;
} catch (SQLException e) {
log.error("[ErrorCodeDAO getMap]getErrorcodeMap error!", e);
} finally {
DataSource.closeRs(rs);
DataSource.closeStatement(stmt);
try {
if (conn != null) {
conn.commit();
}
} catch (SQLException e) {
log.error(e.getMessage(), e);
}
DataSource.closeConnection(conn);
}
//Other init
cts=null;
}
/**
* get the Config Value
*
* @param key
* Config_key
* @return Config_value
*/
public String getConfigValue(String key) {
if (theProperties == null) {
return null;
}
return theProperties.get(key);
}
/**
* get the Config Value, if not exists then return the default value
*
* @param key
* Config_key
* @param defaultValue
* default_Value
* @return Config_value or default_Value
*/
public String getConfigValue(String key, String defaultValue) {
if (theProperties == null || theProperties.get(key) == null) {
return defaultValue;
}
return theProperties.get(key);
}
public Timestamp getCreateTime() {
if (theProperties != null && cts == null) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String timeStr = theProperties.get("ECIF_ACTIVE_TIME");
if (timeStr != null) {
try {
cts = new Timestamp(sdf.parse(timeStr).getTime());
} catch (ParseException e) {
log.error(e.getMessage(), e);
}
}
}
return cts;
}
}
将getInstance方法synchronized,避免发生一个线程过来发现instance为null,创建一个,另一个线程过来还发现instance为null,再创建一个,导致存在多个单例实例的情况;
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 上周热点回顾(1.20-1.26)