golang优雅代码【lock实现】

golang优雅代码【lock实现】

本文代码风格来源参考 database/sql

1.局部锁

database/sql源码中使用 withLock(dc, func(){...}) 方法实现局部锁,完美利用了 golangdefer 关键字对 入参dc 进行加锁解锁,感觉实现很优雅

func (db *DB) queryDC(ctx, txctx context.Context, dc *driverConn, releaseConn func(error), query string, args []any) (*Rows, error) {
	queryerCtx, ok := dc.ci.(driver.QueryerContext)
	...
	if ok {
		...
		withLock(dc, func() {
			// do something ... 
		})
		...
	}
	...
	return rows, nil
}

1.1 具体实现方式

  1. 首先定义 driverConn 封装 sync.Mutex,实现 sync.Locker 接口
type driverConn struct {
	db        *DB
	...
	sync.Mutex  // guards following
}
  1. 定义函数 withLock ,接收 sync.Locker , func() 入参,在内部实现获取/释放锁,并执行对应函数
// withLock runs while holding lk.
func withLock(lk sync.Locker, fn func()) {
	lk.Lock()
	defer lk.Unlock() // in case fn panics
	fn()
}

  1. 使用该方式实现锁
func (db *DB) queryDC(ctx context.Context, dc *driverConn) (*Rows, error) {
	...
	// 获取&释放锁
	withLock(dc, func() {
		// do something ... 
	})
	...
	return rows, nil
}
  1. 对比普通方式(非常容易忘记释放锁,并且还要考虑errror)
func (db *DB) queryDC(ctx context.Context, dc *driverConn) (*Rows, error) {
	...
	// 获取&释放锁
	dc.Lock()
	// do something ... 
	dc.Unlock()
	...
	return rows, nil
}

相关推荐

  1. golang优雅代码lock实现

    2024-06-08 17:10:03       32 阅读
  2. GolangGolang超级实用代码

    2024-06-08 17:10:03       30 阅读
  3. Golang优雅实现按比例切分流量

    2024-06-08 17:10:03       55 阅读
  4. golang基础学习以及代码实例

    2024-06-08 17:10:03       36 阅读
  5. golang channel实践代码及注意事项

    2024-06-08 17:10:03       34 阅读
  6. CPU怎么实现LOCK指令

    2024-06-08 17:10:03       41 阅读
  7. 基于Golang的AOI算法实现优化

    2024-06-08 17:10:03       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-08 17:10:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-08 17:10:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-08 17:10:03       82 阅读
  4. Python语言-面向对象

    2024-06-08 17:10:03       91 阅读

热门阅读

  1. 堆排序---C语言

    2024-06-08 17:10:03       33 阅读
  2. [AIGC] 自定义Spring Boot中BigDecimal的序列化方式

    2024-06-08 17:10:03       27 阅读
  3. Pinia的定义及使用

    2024-06-08 17:10:03       26 阅读
  4. 信奥之路(五)——顺序结构

    2024-06-08 17:10:03       29 阅读
  5. 【HarmonyOS】代码规范参考

    2024-06-08 17:10:03       28 阅读
  6. 力扣每日一题 6/5

    2024-06-08 17:10:03       31 阅读
  7. Ansible——setup模块

    2024-06-08 17:10:03       30 阅读
  8. 开关电源中电感设计

    2024-06-08 17:10:03       34 阅读
  9. 自注意力机学习

    2024-06-08 17:10:03       29 阅读