Go 并发编程面试题, Go 语言中 sync.Once 有什么作用?
Go 并发编程面试题, Go 语言中 sync.Once 有什么作用?
QA
Step 1
Q:: Go 语言中 sync.
Once 有什么作用?
A:: 在 Go 语言中,sync.Once 是一种同步原语,用于确保某些操作只执行一次。无论该操作被调用多少次,sync.Once 都保证该操作仅会执行一次,即使是多线程并发调用。sync.Once 对象通常会与函数或方法配合使用,通过调用 Once.
Do 方法来执行给定的操作,这个操作在整个程序运行过程中只会执行一次。
Step 2
Q:: sync.
Once 的内部实现原理是什么?
A:: sync.
Once 的内部实现通过一个布尔变量 done 和互斥锁 mutex 来保证操作的只执行一次。每次调用 Do 方法时,都会检查 done 变量,如果 done 为 false,则加锁并执行指定的操作,完成后将 done 设置为 true,并解锁。下次再调用 Do 方法时,done 已经为 true,操作不会再次执行。
Step 3
Q:: sync.
Once 适合应用在哪些场景?
A:: sync.
Once 适用于那些需要保证初始化或配置只执行一次的场景,比如单例模式的实现、全局配置的加载、昂贵资源的初始化等。在多线程环境下,这种模式尤其重要,因为它可以避免资源的重复初始化或不必要的资源争用,确保线程安全性。
Step 4
Q:: 如果 sync.Once.
Do 中的函数 panic 会发生什么?
A:: 如果 sync.Once.Do 中的函数发生 panic,操作不会被认为成功执行,因此 done 标志不会被设置为 true。也就是说,下次调用 Do 时,函数会再次被执行。因此,需要小心处理 sync.Once.
Do 中可能的 panic,以免导致不期望的多次执行。
Step 5
Q:: sync.Once 和 sync.
Mutex 的区别是什么?
A:: sync.Once 是为了确保某个操作只执行一次,并且之后的调用不会重复执行该操作。而 sync.Mutex 则是为了确保多个 goroutine 访问共享资源时的互斥性。虽然 sync.
Once 也用到了互斥锁来保证操作的原子性,但它是特定场景下的高级封装。