多线程——i++的坑
2024-08-26 20:56:52
在使用socket编程的时候发生数据丢失问题,一直以为是网络原因,后来测试后发现是多线程操作同一数据源又未加入数据锁导致。
直接上代码,下面程序执行的结果可能出现198、199、200。两个线程统一时间读取iCount的值,各自计算完累加,再把值重新写入到iCount,当这种情况发生时,一个i++就漏掉了,从而导致最终值的不确定性。
private int iCount = ;
private void main()
{
Thread thread_iCountAdd1 = new Thread(iCountAdd);
Thread thread_iCountAdd2 = new Thread(iCountAdd);
thread_iCountAdd1.Start();
thread_iCountAdd2.Start();
}
private void iCountAdd()
{
for(int iTemp = ; iTemp < ; iTemp++)
{
iCount++;
}
}
解决办法是加锁,代码如下:
private int iCount = ;
private object iCountObject = new object();
private void main()
{
Thread thread_iCountAdd1 = new Thread(iCountAdd);
Thread thread_iCountAdd2 = new Thread(iCountAdd);
thread_iCountAdd1.Start();
thread_iCountAdd2.Start();
}
private void iCountAdd()
{
for(int iTemp = ; iTemp < ; iTemp++)
{
lock (iCountObject)
{
iCount++;
}
}
}
最新文章
- SQLServer2005如何批量修改架构名 - wuxiaokaixinguo的专栏
- 常用语句if,for,while
- AJAX笔试面试题汇总
- (easy)LeetCode 205.Reverse Linked List
- 安装mongodb后服务启动不了的问题
- js深入研究之扩展类,克隆对象,混合类(自定义的extend函数,clone函数,与augment函数)
- idea maven 无法加载已经安装的模块
- input输入框限制输入正整数、小数、字母、文字
- 抽屉效果的实现(DrawerLayout和SlidingMenu的对比)
- Studio 5000 指针(间接寻址)编程
- WCF服务could not be activated
- Linux三剑客grep、sed、awk
- grep与正则表达式的使用
- java进行3DES加解密
- centos7下快速安装Nginx服务器
- html垂直居中
- 中式台球 规则 ( ChinaBilliards )
- 【JavaScript】read_line()、print()实现输入输出
- Jmeter遇到Connection reset by peer的解决方法
- 【转】webpack中关于source map的配置