2.4 反面模式
所谓反面模式(Anti-Patterns),通常指的是一些具有警示性的反面故事,它为我们凸显出了一些需要进行深思熟虑的事件和问题域。接下来,我们将会为你列举一些在使用并行循环时需要注意的问题。
2.4.1 隐性循环体依赖
错误分析了循环中的依赖关系往往是导致软件缺陷的主要根源之一。因此,我们要留意所有并行循环体中不可见的隐性依赖,这些是非常容易出错的地方。
举例来说,如果在非线程安全的情况下,我们在各个并行迭代操作之间共享了一个类实例的话,就很可能会遇上这种微妙的依赖性。同样,你也要留意在lambda表达式的封闭域中使用引用变量来共享状态的问题。
即使各循环体之间彼此并不完全独立,我们依然是可以使用并行循环的。只不过,在这种情况下,我们必须确保所有的共享变量是受保护的,并且是可以同步的。同时,我们还必须对自己所引入的任何同步化机制在性能影响方面有充分的认知。尽管这种机制的引入可能会极大地降低并发程序的性能,但如果你因此而忽略了它的必要性,同样会导致程序中出现灾难性的并且难以重现的bug。
如果循环体之间并不存在任何依赖关系—例如执行求和运算—你或许就可以考虑我们将在第4章中介绍的并行循环变体。