大家可以不看我写的程序,直接讨论我的两个问题都是一样的;问题1:在tomcat中实例化了一个实现单例模式的类(BDManager),我果然就发现任何用户都用的是同一个(BDManager)对象,但是什么时候释会放这个对象呢(当然,重启服务器除外),或者怎么手动(写代码)释放呢?或者一直都不释放它好不好呢?问题2:如果很多(或者足够多)的用户都在同时访问服务器,显然用的是同一个对象在调用不同的方法,会有冲突么?(虽然服务器快得不得了,也不排除某一时刻两个用户同时在用这个对象调用它的相同或者不同的方法,出现这种情况怎么办?或者说服务器是否允许这种情况的发生呢?或者说就算出现这种情况,是否照样能正常够完成客户端的请求?)这两天提的问题有点多,仅有的可怜的22分,如数奉献了,对不起大家,,下面是我写的程序:
package mybbs.DB ;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.DriverManager;
import java.sql.PreparedStatement ;
import java.sql.Connection ;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
public class DBManagerSingleton implements DBManager{   

 
public static DBManagerSingleton DBInstance=null;
public static synchronized DBManagerSingleton getInstanc(){
if(DBInstance==null){
DBInstance=new DBManagerSingleton();
}
return DBInstance;
}
 

private String DBDriver = "com.mysql.jdbc.Driver" ;
private String DBUrl = "jdbc:mysql://localhost/mybbs?useUnicode=true&characterEncoding=gb2312" ;

private String DBUser = "root" ;
private String DBPassword = "root" ;
private Connection conn = null ;
private DBManagerSingleton(){

try {
Class.forName(DBDriver) ;
} catch (ClassNotFoundException e) {

e.printStackTrace();
}
System.out.println("构造函数里已经做完许多事情");
}

public Connection getConn()
{
try
{

conn = DriverManager.getConnection(DBUrl,DBUser,DBPassword) ;//SQLException;
}catch(SQLException e){
e.printStackTrace();

}
  

return conn;
}

/***************外部可以调用的两种关闭的情况****************************/
public void closeAll(ResultSet rs,PreparedStatement pstmt ,Connection conn )
{
try {
if(rs!=null){pstmt.close();rs=null;}
if(pstmt!=null){pstmt.close();pstmt=null;}
if(conn!=null){conn.close();conn=null;}
} catch (SQLException e) {

e.printStackTrace();
}
}
public void closeTwo(PreparedStatement pstmt ,Connection conn )
{
try {
if(pstmt!=null){pstmt.close();pstmt=null;}
if(conn!=null){conn.close();conn=null;}
} catch (SQLException e) {

e.printStackTrace();
}
}

}

解决方案 »

  1.   

    很显然, 你如果怕多线程出问题的话, 你getInstance这个方法就应该做synchronized
      

  2.   


    但是我觉得没有必要给getInstance方法加synchronized 关键字呀,因为既然是单列模式,至始至终就
    只有一个对象,不会有第二个对象来调用它呀,。我知道外边会有多个用户(或者方法,或者对象)来调用这个getInstance方法,但是这个getInstance永远只有一个嘛,所有用户(或者方法,或者对象)轮流执行这个getInstance方法嘛!对么?,,
      

  3.   

    你先在需要理解的不是单例,而是synchronize
      

  4.   

       Synchronized  它是线程同步中的一种同步代码块的关键字。