您的位置:首页 > 其它

记多线程操作一个BUG

2013-06-21 23:11 267 查看
今天碰到一个多线程的BUG,在这里记一下:

问题是这样的:在调试一个JAVA服务器跟C++ server一个对接问题,在java的收到HTTP包的必经的地方,做一个计数。发现JAVA里的计数,跟C++server的数据数总是要少一些。因为C++ server是我写的,所以我排查了一下,确信在计数的地方是单线程操作的,这里不会出问题。那么问题就出现在JAVA的WEB server,在JAVA的计数地方,我发现有个一个单例模式 的对象,代码如下:

public static LogServer GetInstance() {

if (s_LogServer == null) {

s_LogServer = new LogServer();

}

return s_LogServer;

}

而这个对象在高并发的情况下,可能被几条线程同时调用。那么创建的对象不是单例模式,应该做下面修改:

public static LogServer GetInstance() {

if (s_LogServer == null) {

synchronized (lock) {

if (s_LogServer == null) {

s_LogServer = new LogServer();

}

}

}

return s_LogServer;

}

这样通过几轮的高并发测试,两边的数据个数是统一的 了

备注:

这样写其实在多线程还是有问题的,线做如下修改:

private static LogServer s_LogServer = new LogServer();

public static LogServer getInstance(){

return s_LogServer;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: