// 全局: strUCt MyStruct ... { int a, b; } ; MyStruct s; // 線程1: int a = s.a; int b = s.b; // 線程2: s.a ++ ; s.b -- ; 假如實際的執行順序就是上述書寫的順序那到沒有什么,但假如線程2的執行打斷了線程1,變為如下順序:
int a = s.a; //線程1 s.a++; //線程2 s.b++; //線程2 int b = s.b; //線程1 那么這時線程1讀出來的a和b就會有問題了,因為a是在修改前讀的,而b是在修改后讀的,這樣讀出來的是不完整的數據,會對程序帶來不可預料的后果。天知道兩個程的調度順序是什么樣的。為了防止這種情況的出現,需要對變量s加鎖,也就是當線程1得到鎖以后就可以放心的訪問s,這時假如線程2要修改s,只有等線程1訪問完成以后將鎖釋放才可以,從而保證了上述兩線程交叉訪問變量的情況不會出現。