#### 接触并发编程不多,所以问题有点基础
### 前提:
完成了整个go tour课程+练习 (吐槽下,tour.studygolang.com 的教程内容,https://tour.golang.org 不一致,https://tour.golang.org/welcome/3 生生被吃掉了,而且居然比用 go tool tour 本地起服的版本“精简”了辣木多 —_—!) 提醒后续学习,都要以英文版为优,所有练习,都是针对前面铺垫的教程来的,所以练习solution以 https://github.com/golang/tour/blob/master/solutions 所提供的作为最佳参考之一
### 问题:
Web Crawler 练习题( https://tour.golang.org/concurrency/10 ),参考solution( https://github.com/golang/tour/blob/master/solutions/webcrawler.go )
**(简述)**solution代码第53行处但锁是否可以不设立
**(详细)**参考解决方案中,共有两处使用了sync.Mutex来lock和unlock,
第一处为solution代码第39行处,检查当前方法执行环境下被爬的url是否已经被爬过,此处并发锁理解为,多个线程同时进行网址爬取,相同网址被线程1和2同时爬取时,线程1可能已经在进行爬取,但未写入爬取结果,此时线程2查询当前网址是否被爬取过时,查询结果为未爬取过,导致线程1、2同时对一个网址进行了两次爬取操作。
第二处为solution代码第53行处,将当前执行线程中爬取网址成功与否记录到已爬取网址记录中,既然题目表示只需要防止重复爬取,第一处并行锁不足以满足这点吗?第二处的并行锁存在的意义是什么?可以去掉吗?
#### 感谢浏览,希望能得到解答
有疑问加站长微信联系(非本文作者)