日期:2014-05-17  浏览次数:20731 次

今天去面试,遇到一个很难的java题目,请问:该如何回答?题目内容如下:
在一个java web工程中,有一个类,需要频繁的实例化该类进而使用它,使用完后要频繁的销毁它来释放系统资源,可是,每一次创建和销毁这个类,都需要耗费很大的系统资源。
请问:你有什么优化措施?








------解决方案--------------------
如果是单任务的就单例,如果是多任务的可能需要池化
------解决方案--------------------
如果有属性值,尽量不要做成单例,除非做了足够的同步,否则会有并发问题。做成池应该是很好的方案
------解决方案--------------------
池化就想想数据库链接池,通常做JavaWeb开发的都秒懂了。

其实还可以用任务队列的方式,各种MQ。
------解决方案--------------------
赞同2L观点:单任务用单例;多任务用池(为什么用池:为了不让数据共享,可以想象,若每个用户请求都能看到其他人的请求信息,这太不安全了)
附带用代理实现的连接池,供参考:
public class DBProxyUtil {
private static Connection conn = null;
private static List<Connection> pool = new ArrayList<Connection>();
static{
String dirver = "com.mysql.jdbc.Driver";
String uri = "jdbc:mysql:///user?characterEncoding=UTF8";
String name = "root";
String pwd = "root";
try {
//初始化一个含有10个连接的连接池
for(int index = 0;index < 10;index++){
Class.forName(dirver);
conn = DriverManager.getConnection(uri,name,pwd);
  //代理对象
Object obj = Proxy.newProxyInstance(DBProxyUtil.class.getClassLoader(),
new Class[]{Connection.class},  //所需要代理类的接口类
new InvocationHandler(){  //句柄,这里主要拦截代理类方法,除getClass方法外
public Object invoke(Object proxy, Method method,
Object[] args) throws Throwable {
if("close".equals(method.getName())){
//当进行关闭操作是,代理连接不进行关闭操作,将所用连接返回到连接池中
System.out.println("关闭连接。。");
synchronized (pool) {
//将连接放回连接池
pool.add((Connection)proxy);
//唤醒等待的线程
pool.notify();
}
return null;
}else{
//执行除close方法之外的方法,这里的o对象是方法返回值对象
Object o = method.invoke(conn, args);
return o;
}
}

});
pool.add((Connection)obj);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConn(){
synchronized (pool) {
//当连接池中的连接个数为0时,线程进入等待队列
if(pool.size() == 0){
try {
pool.wait();
} catch&