// 我用的测试代码
package main
import (
    "log"
    "net/http"
    "time"
)
type Server struct {
    lock bool
}
func (s *Server) listen(port string) {
    mux := http.NewServeMux()
    mux.HandleFunc("/a", s.testHandler)
    mux.HandleFunc("/b", s.testHandler)
    mux.HandleFunc("/c", s.testHandler)
    mux.HandleFunc("/d", s.testHandler)
    mux.HandleFunc("/e", s.testHandler)
    mux.HandleFunc("/f", s.testHandler)
    mux.HandleFunc("/g", s.testHandler)
    mux.HandleFunc("/h", s.testHandler)
    mux.HandleFunc("/i", s.testHandler)
    mux.HandleFunc("/j", s.testHandler)
    http.ListenAndServe(":"+port, mux)
}
func (s *Server) testHandler(w http.ResponseWriter, r *http.Request) {
    log.Println("here")
    if s.lock == true {
        w.Write([]byte("locked"))
        log.Println("locked")
        return
    }
    s.lock = true
    time.Sleep(60 * time.Second)
    s.lock = false
    log.Println("unlocked")
    w.Write([]byte("unlocked"))
}
func main() {
    server := Server{
        lock: false,
    }
    server.listen("8888")
}
Console 控制台测试同时打开
// console 控制台同时打开下面这组会阻塞,但是过几秒很奇怪的是后面九条是同时完成
window.open("http://127.0.0.1:8888/a");
window.open("http://127.0.0.1:8888/a");
window.open("http://127.0.0.1:8888/a");
window.open("http://127.0.0.1:8888/a");
window.open("http://127.0.0.1:8888/a");
window.open("http://127.0.0.1:8888/a");
// console 控制台不会阻塞
window.open("http://127.0.0.1:8888/a");
window.open("http://127.0.0.1:8888/b");
window.open("http://127.0.0.1:8888/c");
window.open("http://127.0.0.1:8888/d");
window.open("http://127.0.0.1:8888/e");
window.open("http://127.0.0.1:8888/f");
|  |      1geelaw      2019-03-29 06:45:44 +08:00 可能这就是学海无涯的奥义:让人难懂。 | 
|  |      2woscaizi      2019-03-29 06:48:00 +08:00 via iPhone http 429 状态码呢? | 
|      3cs8425      2019-03-29 08:38:29 +08:00  1 `s.lock == true` 你这个操作不是 atomic, 也没有上锁 在 golang, 每个 http request 是一个 goroutine, 是能并发的 有机会同时进入`time.Sleep(60 * time.Second)`这行 当然会造成 9 个卡住又同时完成 | 
|      4yrom      2019-03-29 08:51:29 +08:00 不是变量叫 lock 就是锁了 == | 
|  |      5des      2019-03-29 08:56:06 +08:00 via Android 我佛了,就不能换 post,或者加个随机参数吗? | 
|      60ZXYDDu796nVCFxq      2019-03-29 09:01:46 +08:00 via Android  2 同时暴露了 golang,HTTP 协议,浏览器三者都不熟 | 
|  |      7AngryPanda      2019-03-29 09:08:52 +08:00 via Android OMG | 
|  |      8Zzdex      2019-03-29 09:34:37 +08:00 第一次见这样上锁的。。。 | 
|  |      9ooh OP | 
|  |      10est      2019-03-29 10:23:07 +08:00 控制变量,用 nginx 先试试。 | 
|      11runze      2019-03-29 10:28:42 +08:00 | 
|  |      12ooh OP @est 已经抓包测试了,是浏览器控制了访问顺序,第一个请求发出如果服务器没返回,就会阻塞后面的请求,查过有的说是缓存策略,但是我禁止缓存,还是这样的,暂时没找到权威的资料,中午有空再研究看看 | 
|  |      13Zzdex      2019-03-29 11:11:45 +08:00 试了下,先不考虑锁的问题,确实是标题这样的, 同时只能对同一个 URL 提出一个请求 第二个请求会阻塞在 stalled,等待上一个请求完成  ) 把 disabled cache 打开就好了,也就是请求头中增加 `Cache-Control: no-cache` | 
|  |      14c4f36e5766583218      2019-03-29 19:15:29 +08:00 弱弱问下: 这是什么语言、 | 
|  |      15ooh OP @c4f36e5766583218 golang | 
|      16q540374501      2019-08-08 16:25:59 +08:00 确实是这样的,气死我了 |