大家好。《.net设计规范》第128页第一段有点不解:
书上举例说,一个事件处理方法中:
if (Click != null) Click(this, e); 这里可能存在竞态条件,在第一行和第二行之间事件可能会被清除。
这要怎么理解呢?
书上下一段:
实际上开发人员应该这样写:
ClickHandler handler = Click;
if (handler != null) handler(this, e);
这段写法和上一段写法区别在哪?如果说上面那一段的if那一句不是原语操作,那下面那段不也是一样的么?改进在哪?
谢谢指点!:)
先看看第一种方法
1. if (Click != null)
2. Click(this, e);
假设现在有多线程,2个线程分别为A和B,执行如下
1(A). if (Click != null) //这里是true
2(B). Click = null; //B线程正好把Click变成null
3(A). Click(this, e); //很遗憾,这里是NullReferenceException
再看第2种方法
1(A). ClickHandler handler = Click; //用变量handler保存Click的引用
2(B). Click = null; //Click虽然是null了,handler依旧不是null
3(A). if (handler != null) //这里是true
4(A). handler(this, e); //由于handler是A线程拥有的本地变量,B线程无法干涉,因此handler肯定不会在判断null之后被其他线程赋值,所以此处handler肯定不会是null