今天碰到一个多线程的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;
}