多线程——i++的坑
在使用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++;
}
}
}
多线程——i++的坑的更多相关文章
- 记录关于Android多线程的一个坑
最近在写项目的时候由于联网用得比较频繁,就简单地封装了一个工具类,省得每次联网得时候都要把联网配置写一遍,代码如下: public class okhttp_plus { public static ...
- C#多线程List的非线程安全性
背景:最近在做多线程方面的工作,工作中发现多线程中很多坑,这里就有一个List添加对象的误区,这里做个分享跟大家讲讲这个坑是怎么形成的怎么样避免. 示例: 代码及错误: 如果单单只从程序逻辑上看,应该 ...
- Python多线程多进程那些事儿看这篇就够了~~
自己以前也写过多线程,发现都是零零碎碎,这篇写写详细点,填一下GIL和Python多线程多进程的坑~ 总结下GIL的坑和python多线程多进程分别应用场景(IO密集.计算密集)以及具体实现的代码模块 ...
- C#多线程(13):任务基础①
目录 多线程编程 多线程编程模式 探究优点 任务操作 两者创建任务的方式 Task.Run() 创建任务 取消任务和控制任务的创建 任务返回结果以及异步获取返回结果 捕获任务异常 全局捕获任务异常 多 ...
- python——进程基础
我们现在都知道python的多线程是个坑了,那么多进程在这个时候就变得很必要了.多进程实现了多CPU的利用,效率简直棒棒哒~~~ 拥有一个多进程程序: #!/usr/bin/env python #- ...
- mysql Connector C++ 操作数据库 vs2012
最近想写一个应用程序,要连接和操作mysql数据库,以前只是用c++ builder 操作过mysql数据库,那是用控件操作的,感觉比较弱智,但是c++ builder vcl控件感觉在多线程里比较坑 ...
- 多线程爬坑之路-Thread和Runable源码解析之基本方法的运用实例
前面的文章:多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类) 多线程爬坑之路-Thread和Runable源码解析 前面 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- c/c++ 多线程 ubuntu18.04 boost编译与运行的坑
多线程 boost编译与运行的坑 背景:因为要使用boost里的多线程库,所以遇到了下面的坑. 系统版本:ubuntu18.04 一,安装boost 1,去boost官网下载 boost_1_XX_0 ...
随机推荐
- 《JAVASCRIPT高级程序设计》节点层次和DOM操作技术
DOM可以将任何HTML和XML文档描绘成一个由多层次节点构成的结构.节点分为几种不同的类型,每种类型分别表示文档中不同的信息,每种类型都继承与Node接口,因此都共同享有一些属性和方法,同时,也拥有 ...
- Python之日期与时间处理模块(date和datetime)
本节内容 前言 相关术语的解释 时间的表现形式 time模块 datetime模块 时间格式码 总结 前言 在开发工作中,我们经常需要用到日期与时间,如: 作为日志信息的内容输出 计算某个功能的执行时 ...
- jq操作img大小(动态修改)
今天适配app页面是约到一个问题 当我们要显示后台传过来若干个尺寸不一的图片时,为了保证图片大小的一致性及比例的协调,需要动态改变图片显示尺寸. 通过搜索,我们可以从网上找到实现此功能的jQuery代 ...
- Java性能优化_转载
一.避免在循环条件中使用复杂表达式 1.在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 2.不可使用多层循嵌套. 二.集合大 ...
- 真机测试错误“The application could not be verified”
真机测试错误"The application could not be verified" 真机测试的时候报错:"The application could not be ...
- (原)SQL Server 系统提供功能的三个疑惑
本文目录列表: 1.SQL Server系统提供的部分疑惑概述2.系统函数调用时DEFAULT代替可选参数使用不统一3.队列字段列message_enqueue_time记录的是UTC日期时间 4.@ ...
- 【踩坑速记】MIUI系统BUG,调用系统相机拍照可能会带给你的一系列坑,将拍照适配方案进行到底!
一.写在前面 前几天也是分享了一些学习必备干货(还没关注的,赶紧入坑:传送门),也好久没有与大家探讨技术方案了,心里也是挺痒痒的,这不,一有点闲暇之时,就迫不及待把最近测出来的坑分享给大家. 提起An ...
- Monit:开源服务器监控工具
Monit是一个跨平台的用来监控Unix/linux系统(比如Linux.BSD.OSX.Solaris)的工具.Monit特别易于安装,而且非常轻量级(只有500KB大小),并且不依赖任何第三方程序 ...
- Azure 基础:用 PowerShell 自动发布 CloudServices
在软件的开发过程中,自动化的编译和部署能够带来很多的优势.下面我们聊聊如何自动发布云应用程序到 azure 上的 cloud services. 打包要发布的内容 首先使用 msbuild 编译 *. ...
- MINIDVD
import java.util.*; public class MiniDVD { public static void main(String[] args){ //扫描器 Scanner inp ...