多线程溢出写法:
public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener(new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
});
}
}
点评:加粗的这一段隐式this事件线程已经暴露给ThisEscape构造函数,而构造函数在该类中首先被其他类调用,因此整个this都暴露了。只要其他线程在ThisEscape未构造之前(构造返回状态)调用这个类,那么this就会被新建线程共享并识别它(线程溢出)。
因此正确的写法:
public class ThisEscape{
private final EventListener listener;
private ThisEscape() {
listener = new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
};
}
public static ThisEscapenewInstance(EventSource source) {
ThisEscapesafe = new ThisEscape();
source.registerListener(safe.listener);
return safe;
}
点评:利用工厂模式来规避EventListener线程溢出,新建的线程无法在构造函数之前共享和识别safe,从而保证线程安全。
我们在做jdbc连接一般也是采用工厂模式,但很少考虑是否存在线程溢出的现象,应尽量避免使用静态块,因此需要引起足够的重视。
案例分析:
public class ConnectionPool {
private Vector<Connection> pool;
private String url="jdbc:mysql://localhost:3306/xxx";
private String username="root";
private String password="root";
private String driverClassName="com.mysql.jdbc.Driver";
/**
* 连接池的大小,连接数
*/
private int poolSize=10;
private static ConnectionPool instance =null;
/**
* 私有的构造方法,禁止外部创建本类的对象,要想获得本类的对,通过getIstance方法
* 使用了设计模式中的单子模式
*/
private ConnectionPool(){
init();
}
private void init(){
pool =new Vector<Connection>(poolSize);
//readConfig();
addConnection();
}
public synchronized void release(Connection conn){
pool.add(conn);
}
/**
* 关闭连接池中所有数据库的连接
*/
public synchronized void closePool(){
for(int i=0;i<pool.size();i++){
try{
((Connection)pool.get(i)).close();
}catch(SQLException e){
e.printStackTrace();
}
pool.remove(i);
}
}
/**
* 返回当前连接池中的一个对象
*/
public static ConnectionPool getInstance(){
if(instance==null){
instance=new ConnectionPool();
}
return instance;
}
/**
* 返回连接池中的一个数据库连接
*/
public synchronized Connection getConnection(){
if(pool.size()>0){
Connection conn=pool.get(0);
pool.remove(conn);
return conn;
}else{
return null;
}
}
private void addConnection(){
Connection conn=null;
for(int i=0;i<poolSize;i++){
try{
Class.forName(driverClassName);
conn=DriverManager.getConnection(url,username,password);
pool.add(conn);
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException r){
r.printStackTrace();
}
}
}
private void readConfig(){
try{
String path=System.getProperty("use.dir")+"\\dbpool.properties";
FileInputStream is=new FileInputStream(path);
Properties props=new Properties();
props.load(is);
this.driverClassName=props.getProperty("driverClassName");
this.username=props.getProperty("username");
this.password=props.getProperty("password");
this.url=props.getProperty("url");
this.poolSize=Integer.parseInt(props.getProperty("poolSize"));
}catch(Exception e){
e.printStackTrace();
System.out.println("读取属性文件错误");
}
}
点评:这个连接池算是比较健全了,但还是有不足的地方,看下标记的绿色的部分应加上final,橙色加粗部分应加上volatile
分享到:
相关推荐
异常点处理则旨在识别和处理那些可能由于测量误差或其他因素导致的极端或不寻常的数据点,以减少对模型的影响。标准化与归一化是将数据转化为统一尺度的过程,有助于提高模型的训练效率和准确性。特征提取是从原始...
- **需求管理**:收集、分析和管理需求,确保产品满足用户的实际需求。 - **软件架构**:定义系统的整体结构,包括模块划分、接口设计等,是系统稳定性的基石。 - **迭代开发**:通过小步快跑的方式降低风险,...
基于python+django开发的宠物商店-宠物管理系统设计与实现-Python源码毕业设计
【微信小程序源码期末大作业毕业设计】V2EX社区小程序
基于python+mysql+vue开发的大学生社团管理系统-python设计源码.zip
【微信小程序源码期末大作业毕业设计】树芽读书-小程序项目源码.zip
【微信小程序源码期末大作业毕业设计】仿网易蜗牛读书-小程序项目源码
微信小程序源码期末大作业毕业设计之健康菜谱小程序!!!
微信小程序源码期末大作业毕业设计之仿美团外卖小程序源码!!!
微信小程序源码期末大作业毕业设计之饿了么外卖小程序!!!
微信小程序源码期末大作业毕业设计之仿ofo共享单车小程序源码
【微信小程序源码期末大作业毕业设计】股票分时图K线图小程序
iCMS 是一套采用 PHP 和 MySQL 构建的高效简洁的内容管理系统,为您的网站提供一个完美的开源解决方案
【微信小程序源码期末大作业毕业设计】咫尺商圈多商家小程序
golang支付库 想必gopher们都会抱怨go成熟的包太少,特别是go语言支付这块,网上的代码基本没有能用的,要么不全,要么有硬伤,所以结合网上和自己经验,抽出时间写的一部分代码,封装下分享出来,希望能给大家一点...
【微信小程序源码期末大作业毕业设计】蜗牛生活服务
【微信小程序源码期末大作业毕业设计】电器租赁小程序
【微信小程序源码期末大作业毕业设计】房贷计算器
【微信小程序源码期末大作业毕业设计】天天快拍
【微信小程序源码期末大作业毕业设计】仿斗鱼直播小程序