【面试题】Golang之互斥锁与读写锁(第七篇)

在Go语言(Golang)中,锁是用来实现并发控制的一种机制,它可以帮助多个goroutine安全地访问共享资源,防止数据竞争和条件竞争的发生。Go标准库提供了多种锁的实现,其中最常见和最基本的包括互斥锁(Mutex)和读写锁(RWMutex)。

互斥锁(Mutex)

互斥锁是Go中最基本的锁类型,它确保了同一时刻只有一个goroutine能够访问某个资源。sync包中的Mutex类型提供了加锁(Lock)和解锁(Unlock)的方法。


	import "sync" 

	


	var ( 

	mu sync.Mutex 

	// 假设这里是某个共享资源 

	counter int 

	) 

	


	func increment() { 

	mu.Lock() // 加锁 

	// 临界区开始 

	counter++ 

	// 临界区结束 

	mu.Unlock() // 解锁 

	}


在上面的例子中,increment函数在修改全局变量counter之前会先调用mu.Lock()进行加锁,确保在修改过程中没有其他goroutine能够访问counter。修改完成后,通过mu.Unlock()解锁,允许其他goroutine访问counter

读写锁(RWMutex)

读写锁是互斥锁的一种变体,它允许多个goroutine同时读取共享资源,但在写入资源时,会阻塞其他所有读取和写入的goroutine。sync包中的RWMutex类型提供了RLock(读锁)、RUnlock(释放读锁)、Lock(写锁)和Unlock(释放写锁)方法。


	import "sync" 

	


	var ( 

	rwmu sync.RWMutex 

	// 假设这里是某个共享资源 

	data map[string]int 

	) 

	


	func readData(key string) int { 

	rwmu.RLock() // 加读锁 

	defer rwmu.RUnlock() // 确保在函数结束时释放读锁 

	// 读取数据 

	return data[key] 

	} 

	


	func writeData(key, value string) { 

	rwmu.Lock() // 加写锁 

	defer rwmu.Unlock() // 确保在函数结束时释放写锁 

	// 修改数据 

	data[key] = len(value) 

	}

在上面的例子中,readData函数通过rwmu.RLock()加读锁,允许多个goroutine同时读取data,而不会相互阻塞。而writeData函数通过rwmu.Lock()加写锁,确保在写入过程中没有其他goroutine能够读取或写入data

注意事项

  • 使用锁时,要特别注意避免死锁的发生,即两个或多个goroutine相互等待对方释放锁的情况。
  • 锁的粒度应该尽量小,只锁定需要保护的关键部分,以提高程序的并发性能。
  • 锁的解锁操作应该放在加锁操作之后的每个退出路径上,通常通过defer语句来实现,以确保即使在发生错误时也能正确释放锁。
  • 在使用读写锁时,要注意写操作的频率和持续时间,因为写操作会阻塞所有的读操作和写操作,如果写操作过于频繁或持续时间过长,可能会导致读操作的性能下降。

相关推荐

  1. 面试Golang互斥()

    2024-07-17 10:32:07       22 阅读
  2. Golang-goroutine互斥互斥

    2024-07-17 10:32:07       26 阅读
  3. 面试Golang 的相关问题()

    2024-07-17 10:32:07       18 阅读
  4. qt中互斥的区别

    2024-07-17 10:32:07       52 阅读
  5. 乐观、悲观互斥

    2024-07-17 10:32:07       26 阅读
  6. linux 内核同步互斥技术自旋

    2024-07-17 10:32:07       51 阅读

最近更新

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

    2024-07-17 10:32:07       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-17 10:32:07       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-17 10:32:07       58 阅读
  4. Python语言-面向对象

    2024-07-17 10:32:07       69 阅读

热门阅读

  1. windows 安装 tensorflow 报错说 C++

    2024-07-17 10:32:07       22 阅读
  2. Vue 和 React 框架实现滚动缓冲区

    2024-07-17 10:32:07       21 阅读
  3. Mysql什么情况下会发生死锁,又该怎么解决?

    2024-07-17 10:32:07       25 阅读
  4. 服务器上有多个nginx,如何知道启动的是哪个?

    2024-07-17 10:32:07       25 阅读
  5. 3,SSH 服务器

    2024-07-17 10:32:07       28 阅读
  6. 外科营养支持病人的护理

    2024-07-17 10:32:07       24 阅读
  7. Netty UDP

    2024-07-17 10:32:07       19 阅读
  8. 初识Flutter问答&学习步骤

    2024-07-17 10:32:07       21 阅读
  9. golang mux组件兼容转移url

    2024-07-17 10:32:07       21 阅读