多线程——i++的坑
在使用socket编程的时候发生数据丢失问题,一直以为是网络原因,后来测试后发现是多线程操作同一数据源又未加入数据锁导致。
直接上代码,下面程序执行的结果可能出现198、199、200。两个线程统一时间读取iCount的值,各自计算完累加,再把值重新写入到iCount,当这种情况发生时,一个i++就漏掉了,从而导致最终值的不确定性。
1 private int iCount = 0; 2 private void main() 3 { 4 Thread thread_iCountAdd1 = new Thread(iCountAdd); 5 Thread thread_iCountAdd2 = new Thread(iCountAdd); 6 thread_iCountAdd1.Start(); 7 thread_iCountAdd2.Start(); 8 } 9 private void iCountAdd() 10 { 11 for(int iTemp = 0; iTemp < 100; iTemp++) 12 { 13 iCount++; 14 } 15 }
解决办法是加锁,代码如下:
1 private int iCount = 0; 2 private object iCountObject = new object(); 3 private void main() 4 { 5 Thread thread_iCountAdd1 = new Thread(iCountAdd); 6 Thread thread_iCountAdd2 = new Thread(iCountAdd); 7 thread_iCountAdd1.Start(); 8 thread_iCountAdd2.Start(); 9 } 10 private void iCountAdd() 11 { 12 for(int iTemp = 0; iTemp < 100; iTemp++) 13 { 14 lock (iCountObject) 15 { 16 iCount++; 17 } 18 } 19 }