tip1:合理使用成员变量与临时变量

来源:互联网 发布:java http连接池 编辑:程序博客网 时间:2024/04/28 05:57

正确区分类成员变量与临时变量,如:

Code:
  1. void foo()    
  2. {    
  3.     ConnectionProvider cp = ConnectionProvider.getInstance();        
  4.     Connection conn = cp.getConnection();//获取一个连接
  5.     ...       
  6.     cp.close(conn);//关闭之
  7. }   

这里conn是一个临时变量,它由getConnection()输出,由close()输入。但如果改成类属性:

Code:
  1. class ConnectionProvider       
  2. {       
  3.     Connection _conn;       
  4.     Connection open()       
  5.     {       
  6.         _conn = getConnection();       
  7.     }       
  8.         
  9.     void close()       
  10.     {       
  11.         _conn.close();       
  12.     }       
  13. }    
  14.   
  15. void foo()   
  16. {   
  17.     ConnectionProvider cp = ConnectionProvider.getInstance();       
  18.     Connection conn = cp.getConnection();       
  19.     ...       
  20.     cp.close();    
  21. }  

试想一下,将这段代码放到多线程环境吧!

假设一个线程刚刚取出conn,另外一个线程却调用了close(),那是什么样的情况?!这就像你的银行卡还没来得及取出来,别人已经取出了其中的钱。这样的问题,即传说中的“线程安全”问题。

解决办法是:换用临时变量,并将其当作函数参数传递到close()函数中去,这样就不会带来“线程安全”问题。临时变量不会共享内存,而同一个对象的成员变量,则有可能由于共享造成并发冲突!

实际上,我遇到的一个bug要比这个隐蔽的多,它是一个多线程FTP下载工具中的bug。多线程环境下的bug比较难于发现和查错,所以很多时候就要求我们的开发人员,尽量正确的使用成员变量与临时变量,正确定义每个类的方法接口,这个是很重要的!

=======================================

如上内容为白乔原创,转载请注明出处。
点击此处,查看作者的新作《把脉VC++》 。
如果你想与我交流,请点击如下链接加我为好友:http://student.csdn.net/invite.php?u=113292&c=8913f87cffe7d533

原创粉丝点击