互斥锁如何与单例一起使用?

我用db连接器实现了单例。 它工作正常,但我无法理解LOCK( mutex.Lock())在做什么。

我试图理解这一点,但是也许有人可以告诉我更多有关此的信息。

我这样理解-> 使用Lock()之后,只需一个goroutine即可运行Lock和Unlock之间的整个代码。 如果这是事实,那不是瓶颈吗?这不是让我的应用程序变慢太多吗?每个gorutine必须等待另一端执行此代码。

package singleton

import (
    "database/sql"
    "fmt"
    "sync"
)

var connector *sql.DB
var mutex = &sync.Mutex{}

func OpenConnection() *sql.DB {
    if connector == nil {
        mutex.Lock()
        defer mutex.Unlock()
        if connector == nil {
            fmt.Println("Creating Single Instance Now")
            var err error
            connector,err = sql.Open("mysql","db_user:.db_password@/books")

            if err != nil {
                panic(err)
            }
        }
    }

    return connector
}
package server

import (
    "connection/singleton"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
    "strings"
)

var connector *sql.DB

func SelectQuery(query string) (*sql.Rows,error) {
    connector = singelton.OpenConnection()
    query = strings.ToLower(query)
    if !strings.Contains(query,"select") {
        panic("Can't use select query to run different query")
    }

    results,err := connector.Query(query)

    if err != nil {
        panic(err.Error()) // proper error handling instead of panic in your app
    }

    return results,err
}
iCMS 回答:互斥锁如何与单例一起使用?

我以这种方式理解它->使用Lock()之后,只需一个goroutine即可运行Lock和Unlock之间的整个代码。如果这是事实,那不是瓶颈吗?这不是让我的应用程序变慢太多吗?每个gorutine必须等待另一端执行此代码。

此处使用互斥锁的原因是仅初始化一次数据库连接。这只会在开始时发生。一旦获得连接,OpenConnection将始终返回连接而无需进入互斥锁块。 这样就不会有任何性能问题。

您还可以使用sync.Once方法来实现相同目的,而无需使用互斥锁和仔细检查。

本文链接:https://www.f2er.com/1512072.html

大家都在问