zoukankan      html  css  js  c++  java
  • tip1:合理使用成员变量与临时变量

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

    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

  • 相关阅读:
    BigDecimal 的用法
    奇葩问题:Invalid bound statement (not found): cn.zss.zsdemo.mapper.RoleMapper.selectByPrimaryKey
    论文速览:MFQE 2.0: A New Approach for Multi-frame Quality Enhancement on Compressed Video
    博文目录
    【DEBUG】ImportError: No module named 'pygal'
    反直觉的三门问题
    一些卷积概念和图解
    MATLAB随手记
    Python3随手记
    论文写作随手记
  • 原文地址:https://www.cnblogs.com/bluejoe/p/5116039.html
Copyright © 2011-2022 走看看