正确区分类成员变量与临时变量,如:
- void foo()
- {
- ConnectionProvider cp = ConnectionProvider.getInstance();
- Connection conn = cp.getConnection();//获取一个连接
- ...
- cp.close(conn);//关闭之
- }
这里conn是一个临时变量,它由getConnection()输出,由close()输入。但如果改成类属性:
- class ConnectionProvider
- {
- Connection _conn;
- Connection open()
- {
- _conn = getConnection();
- }
- void close()
- {
- _conn.close();
- }
- }
- void foo()
- {
- ConnectionProvider cp = ConnectionProvider.getInstance();
- Connection conn = cp.getConnection();
- ...
- cp.close();
- }
试想一下,将这段代码放到多线程环境吧!
假设一个线程刚刚取出conn,另外一个线程却调用了close(),那是什么样的情况?!这就像你的银行卡还没来得及取出来,别人已经取出了其中的钱。这样的问题,即传说中的“线程安全”问题。
解决办法是:换用临时变量,并将其当作函数参数传递到close()函数中去,这样就不会带来“线程安全”问题。临时变量不会共享内存,而同一个对象的成员变量,则有可能由于共享造成并发冲突!
实际上,我遇到的一个bug要比这个隐蔽的多,它是一个多线程FTP下载工具中的bug。多线程环境下的bug比较难于发现和查错,所以很多时候就要求我们的开发人员,尽量正确的使用成员变量与临时变量,正确定义每个类的方法接口,这个是很重要的!
=======================================
如上内容为白乔原创,转载请注明出处。
点击此处,查看作者的新作《把脉VC++》 。
如果你想与我交流,请点击如下链接加我为好友:http://student.csdn.net/invite.php?u=113292&c=8913f87cffe7d533