在使用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 }