// 全局: 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访问完成以后将锁释放才可以,从而保证了上述两线程交叉访问变量的情况不会出现。