MST

星途 面试题库

面试题:Go并发编程中的同步机制

假设你有一个银行账户结构体,包含余额字段。现在有多个goroutine会对这个账户进行存款和取款操作,每次操作完成后打印账户余额。请使用Go的并发同步机制(如互斥锁、条件变量等)来保证账户余额操作的线程安全,并写出完整代码。
48.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

// 定义银行账户结构体
type BankAccount struct {
    balance int
    mutex   sync.Mutex
}

// 存款方法
func (a *BankAccount) Deposit(amount int) {
    a.mutex.Lock()
    defer a.mutex.Unlock()
    a.balance += amount
    fmt.Printf("存款 %d 后,余额为: %d\n", amount, a.balance)
}

// 取款方法
func (a *BankAccount) Withdraw(amount int) {
    a.mutex.Lock()
    defer a.mutex.Unlock()
    if a.balance >= amount {
        a.balance -= amount
        fmt.Printf("取款 %d 后,余额为: %d\n", amount, a.balance)
    } else {
        fmt.Println("余额不足,取款失败")
    }
}

func main() {
    var wg sync.WaitGroup
    account := BankAccount{balance: 1000}

    // 模拟多个goroutine进行存款和取款操作
    for i := 0; i < 3; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            account.Deposit(500)
        }()
    }

    for i := 0; i < 2; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            account.Withdraw(300)
        }()
    }

    wg.Wait()
}

上述代码定义了一个 BankAccount 结构体,其中包含余额字段 balance 和一个互斥锁 mutexDepositWithdraw 方法通过互斥锁来保证对余额操作的线程安全。在 main 函数中,启动多个 goroutine 模拟存款和取款操作,并使用 sync.WaitGroup 等待所有操作完成。