代码之家  ›  专栏  ›  技术社区  ›  Lansana Camara

Golang:具有只读访问权限的包作用域变量需要互斥锁吗?

go
  •  0
  • Lansana Camara  · 技术社区  · 8 年前

    如果我有这样一个包范围的变量:

    var (
        bus *Bus // THIS VARIABLE
    )
    
    // Bus represents a repository bus. This contains all of the repositories.
    type Bus struct {
        UserRepository *UserRepository
        // ...
    }
    

    …我可以访问 bus 变量,以便它们可以相互访问。如果可以同时使用,我需要使用任何类型的互斥锁吗?

    将发生什么的快速伪代码:

    // Router
    router.GET("/user/:id", c.FindUser)
    
    // Controller
    func (c *UserController) FindUser(w http.ResponesWriter, r *http.Request) {
        w.Write([]byte(c.UserService.FindUser(r.Get("id"))))
    }
    
    // Service
    func (s UserService) FindUser(id int) *domain.User {
        return s.UserRepository.FindByID(id) 
    }
    
    // Repository
    func (r UserRepository) FindByID(id int) *domain.User {
        // This is where the package-scope `bus` variable will be used
    }
    

    FindByID 公共汽车 变量,当然可以并发访问,因为只要HTTP请求触发它,就会调用它,并且这些都是并发处理的。

    1 回复  |  直到 8 年前
        1
  •  6
  •   del-boy    8 年前

    如果您只需要读取变量的内容,那么不需要互斥锁。然而,如果你改变了它的状态,那么你需要保护它。

    两次并发写入或并发写入和读取可能会导致问题。如果你写的东西很少,你可能想用 RWMutex 。它将允许多个读卡器访问,但不能与一个写卡器一起访问。

    race detector 。它是尽力而为的检测器,因此它不能保证您没有竞争条件,但它可以检测一些用例。还要注意,您需要引起race,以便race检测器检测到它,所以编写使用您的 bus