最新golang语言面试题总结(四)

1、sema锁是什么?mutex源码中的结构有看过吗?

  1. 互斥锁(Mutex)的核心作用

    • 保证原子性。
  2. 互斥锁的使用原则

    • 适用于并发编程。
    • 尽量减少加锁区域的逻辑。
  3. 互斥锁的局限性

    • 仅限于单个进程内操作。
  4. 信号量(Semaphore)

    • 用于并发控制的机制。
    • 资源计数:信号量维护一个资源计数,表示当前可用的资源数量。
    • 获取操作(P操作):协程在获取资源时会检查信号量的资源计数,如果大于0,则获取资源并使计数减1;如果为0,则协程阻塞等待。
    • 释放操作(V操作):协程使用完资源后释放,信号量的计数加1,如果有协程在等待,其中一个会被唤醒并获取资源。

简而言之,Go语言中用于同步并发操作的两种机制:互斥锁和信号量,包括它们的作用、使用原则和局限性。

2、Go语言中互斥锁(Mutex)的两种操作模式:正常模式和饥饿模式

  1. 正常模式

    • 在正常模式下,等待互斥锁的协程(goroutine)会按照先进先出(FIFO)的顺序排队。
    • 被唤醒的协程并不直接获得互斥锁,而是要与新到达的协程竞争锁的所有权。
    • 新到达的协程有优势,因为它们可能已经在CPU上运行,且数量可能很多,导致被唤醒的协程可能再次竞争失败,并被排到等待队列的前端。
    • 如果一个等待者超过1毫秒未能获取到互斥锁,互斥锁会切换到饥饿模式。
  2. 饥饿模式

    • 在饥饿模式下,互斥锁的所有权直接从解锁的协程传递给等待队列前端的等待者。
    • 新到达的协程不会尝试获取互斥锁,即使互斥锁看起来未被锁定,也不会自旋。
    • 它们会将自己排到等待队列的末尾。
  3. 模式切换

    • 如果一个等待者获得了互斥锁,并且满足以下条件之一,它会将互斥锁切换回正常操作模式:
      • (1) 它是队列中的最后一个等待者。
      • (2) 它的等待时间少于1毫秒。

简而言之,Go语言中互斥锁的两种操作模式,以及它们如何影响协程获取互斥锁的方式和顺序。

相关推荐
Jerry404_NotFound22 分钟前
工厂方法模式
java·开发语言·jvm·工厂方法模式
一起养小猫22 分钟前
【探索实战】Kurator统一流量治理深度实践:基于Istio的跨集群服务网格
java·云原生·istio
微风欲寻竹影24 分钟前
深入理解Java中的String
java·开发语言
Coder_Boy_24 分钟前
基于SpringAI的智能平台基座开发-(二)
java·人工智能·springboot·aiops·langchain4j
用户68026590511930 分钟前
如何利用 Endpoint Central 提高企业终端管理效率
javascript·后端·面试
代码or搬砖31 分钟前
TransactionManager 详解、常见问题、解决方法
java·开发语言·spring
廋到被风吹走36 分钟前
【Spring】Spring Context 详细介绍
java·后端·spring
Kiyra1 小时前
LinkedHashMap 源码阅读
java·开发语言·网络·人工智能·安全·阿里云·云计算
sheji34161 小时前
【开题答辩全过程】以 山林湖泊生态文明建设管控系统为例,包含答辩的问题和答案
java·spring boot
幽络源小助理1 小时前
SpringBoot兼职发布平台源码 | JavaWeb项目免费下载 – 幽络源
java·spring boot·后端