object obj=new object(); object obj2=new object();
//锁块1 lock(obj){ // do something... }
//锁块2 lock(obj){ // do something... // do something... // do something... }
//锁块3 lock(obj2){ // do something... // do something... // do something... }
这里的lock(obj){} 并不是要在代码块执行完之前 锁住obj不让访问 而是锁住代码块的内容 obj只是相当于一个锁标识 在代码块结束之前,不再允许任何线程 访问,带有obj锁标识的代码块. 也就是说在lock代码块没执行完之前,obj是可读可写的,只是... 不能有任何线程再去访问标识为obj的锁里面的代码块.任何加了obj标识的加锁代码块都不允许
上面代码中 假如锁块1代码没有结束 则锁块2的代码进不去,锁块3的代码能正常进去 (虽然是同一个类型的实例,但必须引用也相同,才会正常加锁,如果实例引用不一致 也不会加锁)