记多线程操作一个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;
}
问题是这样的:在调试一个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;
}
相关文章推荐
- 【笔记】多线程操作Oracle数据库的一个BUG
- 一个低概率bug的定位过程---多线程操作文件时一定要注意
- 修改bug 提交出错:操作失败: 无法更改关系,因为一个或多个外键属性不可以为 null
- 一个移位操作引发的程序Bug
- 多线程操作一个变量示例
- (6) 如何用Apache POI操作Excel文件-----POI-3.10的一个和注解(comment)相关的另外一个bug
- 实习点滴 - 跟一个蠢bug学习多线程调试、线程安全和可重入函数
- luaintf的多线程一个隐藏bug,库中的变量没有加锁
- 一个演示多线程操作及同步的C#程序
- 多线程环境下libcurl的一个Bug
- java 多线程操作同一个变量
- mysql 多线程写入后查询丢失数据的一个bug
- 多线程实验_多生产者多消费者操作一个栈list
- NDK中使用pthread多线程中自己写的一个BUG
- 多线程 操作一个文件的问题.
- 菜鸟自己实现一个多线程操作对象中的同一个数据
- openssl 0.9.7a-0.9.7d的一个多线程bug
- 多线程操作同一个数组时ConcurrentModificationException异常
- C# 实现一个可取消的多线程操作 示例
- 可供多线程调用的只能有一个在执行的原子操作实现