在线程里面执行某些操作,会报错。因为不同的线程他们同时抢着操作,这样就会不安全。

举个例子

张三(线程1),李四(线程2),王五(线程3),用同一个账号,同时去网购买东西,注意是同时进行,线程是并发嘛。
这个账号原本只有100块钱,张三花90买x,李四花20买y,王五花70买z。

因为他们是同时进行的,同一节点,三人账号上的钱都是100。
对于张三来说,账号里面有100元,他用了90,还剩10元。
对于李四来说,账号原本有100元,他用了20,还剩80。
对于王五来说,账号原本有100元,他用了70,还剩30。
他们三个人虽然同一时间购买东西,但是加起来,用了180元。可是账号里面只有100元,纯纯的bug啊。

上面的例子是同时进行的,如果你要说,张三用了90元,这时候账号的钱变成了10元,李四要用20元,账号只有10元了,买不了。这不是同步执行的吗,挨个来。

但是难免会有多线程执行这种同时操作一个东西的情况,简单说,多线程,并发执行的同时,遇到要操作的玩意。如果没有线程再使用,就使用。发现要操作的玩意有线程还没执行完,等他执行完了这个要操作的玩意,之后再执行这个。

lock

lock 关键字可以用来确保代码块完成运行,而不会被其他线程中断。它可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待。这是通过在代码块运行期间为给定对象获取互斥锁来实现的。

假设线程A先执行,线程B稍微慢一点。线程A执行到lock语句,判断obj是否已申请了互斥锁,如果不存在,则申请一个新的互斥锁,这时线程A进入lock里面了。
这时假设线程B启动了,而线程A还未执行完lock里面的代码。线程B执行到lock语句,检查到obj已经申请了互斥锁,于是等待;直到线程A执行完毕,释放互斥锁,线程B才能申请新的互斥锁并执行lock里面的代码。

  1. object lockobj = new object();
  2. lock (lockobj)
  3. {
  4. rprop.Tags.Add(tag);
  5. }

互斥锁用引用类型,object就行了,一个没有啥意义的东西

参考

C#中的lock关键字