• 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

  • 相关阅读:
    kettle的转换组件
    kettle的输出组件
    js的touch事件的实际引用
    touchstart,touchmove,touchend触摸事件的小小实践心得
    Android使用ViewPager实现左右循环滑动及轮播效果
    jQuery漂亮图标的垂直导航菜单
    c#使用WebClient登录网站抓取登录后的网页
    从网页抓取数据的一般方法
    c#通过oledb获取excel文件表结构信息
    c#中高效的excel导入sqlserver的方法
  • 原文地址:https://www.cnblogs.com/bluejoe/p/5116039.html
Copyright © 2020-2023  润新知