记多线程操作一个BUG

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值