今天面试golang碰到了一道考并发和锁的题目,没有完成,所以把它记录下来,仅为以后复习. 场景:在一个高并发的web服务器中,要限制IP的频繁访问.现模拟100个IP同时并发访问服务器,每个IP要重复访问1000次.每个IP三分钟之内只能访问一次.修改以下代码完成该过程,要求能成功输出 success:100 package main import ( "fmt" "time") type Ban struct { visitIPs map[string]time…
竞态,就是多个协程同时访问临界区,由并发而产生的数据不同步的状态. 这个说的有点low,没办法,我就是这么表达的,官方的请度娘. 先上代码: 输出: 为何不是1000?就是因为竞态,发生竞态后,最终的输出是以最后一个协程执行的结果为准,但最后一个协程有一定的随机性,不是先跑先完. 改一下代码: 输出: 因为加了锁,这1000个协程是按照队列的顺序执行12行,所以稳定输出 final value of x 1000 再看: 输出: 照样稳定输出 final value of x 1000,因为信道…