From 0654bff7d50cc11ffe9c4e80b50639828cca4783 Mon Sep 17 00:00:00 2001 From: luxcgo Date: Sat, 5 Oct 2024 22:43:21 +0800 Subject: [PATCH] use sync.Once to replace lock (#5710) * use atomic operation to optimize performance * use sync.Once to replace lock --- client/orm/internal/models/models.go | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/client/orm/internal/models/models.go b/client/orm/internal/models/models.go index e105a494..9f3c5cd9 100644 --- a/client/orm/internal/models/models.go +++ b/client/orm/internal/models/models.go @@ -24,11 +24,10 @@ import ( // ModelCache info collection type ModelCache struct { - sync.RWMutex // only used outsite for bootStrap orders []string cache map[string]*ModelInfo cacheByFullName map[string]*ModelInfo - done bool + bootstrapOnce *sync.Once } // NewModelCacheHandler generator of ModelCache @@ -36,6 +35,7 @@ func NewModelCacheHandler() *ModelCache { return &ModelCache{ cache: make(map[string]*ModelInfo), cacheByFullName: make(map[string]*ModelInfo), + bootstrapOnce: new(sync.Once), } } @@ -93,22 +93,20 @@ func (mc *ModelCache) Set(table string, mi *ModelInfo) *ModelInfo { // Clean All model info. func (mc *ModelCache) Clean() { - mc.Lock() - defer mc.Unlock() - mc.orders = make([]string, 0) mc.cache = make(map[string]*ModelInfo) mc.cacheByFullName = make(map[string]*ModelInfo) - mc.done = false + mc.bootstrapOnce = new(sync.Once) } // Bootstrap Bootstrap for models func (mc *ModelCache) Bootstrap() { - mc.Lock() - defer mc.Unlock() - if mc.done { - return - } + mc.bootstrapOnce.Do(func() { + mc.bootstrap() + }) +} + +func (mc *ModelCache) bootstrap() { var ( err error models map[string]*ModelInfo @@ -310,7 +308,6 @@ end: fmt.Println(err) debug.PrintStack() } - mc.done = true } // Register Register models to model cache