A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

各位童鞋 , 对于locker  和synchronized 一起使用的时候没有想明白,请各位帮住一下。
下面是我 一个 公司写好的 DB连接池的代码.
1.getConnection() 方法中已经用了lock 为什么  getConnection() 方法中还用synchronized ,而revertConnection(Connection conn) 确没有用到

2.ConcurrentLinkedQueue<DBConn> queue 对于 queue 是不是也可以用lock 锁,好比在getConnection()方法 中 用lock 替换synchronized(queue)  
3. refreshConnection(Connection conn) 方法中
synchronized(queue){
                        queue.add(new DBConn(conn));
                        queue.notify();
                }

queue.notify();起到的是什么作用 对于对象queue 没有用到wait 呀
如果问题没有描述清楚,请call
  1. public class ConnectionManager {
  2.         private Logger logger = LoggerFactory.getLogger(ConnectionManager.class);
  3.        
  4.         public static final ConnectionManager instance = new ConnectionManager();
  5.         private ReentrantLock locker = new ReentrantLock();
  6.         private ConnectionPool pool;
  7.         private ConnectionManager(){
  8.                 pool = new ConnectionPool();
  9.         }
  10.         public static ConnectionManager getInstance(){
  11.                 return instance;
  12.         }
  13.        
  14.         public Connection getConnection(){
  15.                 locker.lock();
  16.                 try{
  17.                         return pool.getConnection();
  18.                 }finally{
  19.                         locker.unlock();
  20.                 }
  21.         }
  22.         public void revertConnection(Connection conn){
  23.                 locker.lock();
  24.                 try{
  25.                         pool.revertConnection(conn);
  26.                 }finally{
  27.                         locker.unlock();
  28.                        
  29.                 }
  30.         }
复制代码
  1. package com.ourgame.clown.db;

  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.util.concurrent.ConcurrentLinkedQueue;
  5. import java.util.concurrent.atomic.AtomicInteger;

  6. import org.slf4j.Logger;
  7. import org.slf4j.LoggerFactory;

  8. import com.ourgame.clown.ClownData;
  9. import com.ourgame.clown.config.ServerConfig;

  10. public class ConnectionPool {
  11.         private Logger logger = LoggerFactory.getLogger(ConnectionPool.class);
  12.         private ConcurrentLinkedQueue<DBConn> queue;
  13.         private AtomicInteger amount = new AtomicInteger(0);
  14.        
  15.         public ConnectionPool(){
  16.                 queue = new ConcurrentLinkedQueue<DBConn>();
  17.         }
  18.        
  19.         public Connection refreshConnection(Connection conn){
  20.                 try{
  21.                         conn.close();
  22.                 }catch(Exception e){}
  23.                 return createConnection();
  24.         }
  25.        
  26.         public void revertConnection(Connection conn){
  27.                 if(conn == null){
  28.                         amount.decrementAndGet();
  29.                         return;
  30.                 }
  31.                 synchronized(queue){
  32.                         queue.add(new DBConn(conn));
  33.                         queue.notify();
  34.                 }
  35.                
  36.         }
  37.        
  38.         public synchronized Connection getConnection(){
  39.                 //连接只要闲置超过一分半分钟,则抛弃不要了
  40.                 long time = System.currentTimeMillis();
  41.                 synchronized(queue){
  42.                         while(queue.size()>0){
  43.                                 DBConn sl = queue.poll();
  44.                                 if(time - sl.activeTime>90000){
  45.                                         try{
  46.                                                 sl.conn.close();
  47.                                                 logger.debug("DBManager Close a overtime connection. connection amount="+amount.decrementAndGet()+" queue size="+queue.size());
  48.                                         }catch(Exception e){}
  49.                                         continue;
  50.                                 }else{
  51.                                         logger.debug("DBManager getConnection. connection amount="+amount.get()+" queue size="+queue.size());
  52.                                         return sl.conn;
  53.                                 }
  54.                         }
  55.                 }
  56.                 try{
  57.                         return createConnection();
  58.                 }catch(Exception e){
  59.                         e.printStackTrace(System.err);
  60.                         return null;
  61.                 }
  62.                
  63.         }
  64.        
  65.         private synchronized Connection createConnection(){
  66.                 Connection conn = null;
  67.                 try{
  68.                         ServerConfig config = ClownData.getInstance().getServerConfig();
  69.                         Class.forName(config.getDbDriver());
  70.                         String url = config.getDbDriverURL();
  71.                         if(config.getDbMirror() != null && config.getDbMirror().length()>0){
  72.                                 url += ";failover partner="+config.getDbMirror();
  73.                         }
  74.                         conn = DriverManager.getConnection(url,
  75.                                         config.getDbUser(),
  76.                                         config.getDbPass());
  77.                 }catch(Exception e){
  78.                         logger.debug("Fatal Error create db connection failed.");
  79.                 }
  80.                 amount.incrementAndGet();
  81.                 return conn;
  82.         }
  83.        
  84.         class DBConn{
  85.                 public long activeTime;
  86.                 public Connection conn;
  87.                 public DBConn(Connection conn){
  88.                         this.conn = conn;
  89.                         this.activeTime = System.currentTimeMillis();
  90.                 }
  91.         }
  92. }

复制代码

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 淡定

查看全部评分

4 个回复

倒序浏览
连飘的都木有, 自己飘一下, 大虾们帮忙解释一下{:soso_e141:}
回复 使用道具 举报
你的代码,我想说注释太少,看起来很费劲的,而且代码又不是很少的情况下
回复 使用道具 举报
神之梦 发表于 2013-8-14 00:20
你的代码,我想说注释太少,看起来很费劲的,而且代码又不是很少的情况下 ...

版主 这两个代码 可以全部复制。 是个完整的。 如果有什么需要 我会继续粘出代码。
第一步:首先看的是 想获取连接数据库 访问ConnectionManager  类中getConnection()方法 ,这个方法继续访问。ConnectionPool 类中 getConnection() 方法。
1 我不理解的是 在ConnectionManager  类中getConnection()方法里面已经加了lock 锁 ,为什么 在ConnectionPool 类中 getConnection() 方法中 还需要,synchronized 的 。
2,ConnectionPool 类中 getConnection() 方法中对queue 进行了synchronized 是不是可以换成lock
回复 使用道具 举报
我觉得吧ConnectionManager 中的getConnection()中用不用锁都可以。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马