Go 18.0 专业五


互斥锁

<h2>Go语言中常用的锁</h2> <p>在多协程并发访问共享资源时,为了避免数据竞争和不一致的情况,需要使用锁来进行同步。在Go语言中,常见的锁包括互斥锁(Mutex)和读写锁(RWMutex)。</p> <p>互斥锁是一种常用的同步机制,用于保护共享资源的访问。互斥锁的工作原理如下:</p> <ol> <li> <p>当一个线程需要访问共享资源时,它会尝试获取互斥锁。</p> </li> <li> <p>如果该互斥锁没有被其他线程占用,则该线程可以立即获得锁,并开始执行对共享资源的操作。</p> </li> <li> <p>如果该互斥锁已经被其他线程占用,则该线程将被阻塞,直到互斥锁被释放为止。这样可以避免多个线程同时访问共享资源。</p> </li> <li>当线程完成对共享资源的操作后,它会释放互斥锁,以便其他线程可以获得锁并继续执行。</li> </ol> <p>&gt;互斥锁是一种最简单、最基本的锁,它实现了共享资源的互斥访问。在任意时刻,只能有一个协程持有互斥锁,并访问共享资源。其他协程如果需要访问这个共享资源,必须等待该协程释放锁后才能获取锁并访问共享资源。</p> <h2>卖票案例优化</h2> <p>卖票卖超是一个经典的多线程并发问题,在Go语言中可以使用互斥锁来保证数据的线程安全性,避免卖票数量超过库存数量的情况。</p> <pre><code class="language-go">var wg sync.WaitGroup var mutex sync.Mutex var num int = 0 func main() { var count = 3 //并发数 for i := 0; i &amp;lt; count; i++ { wg.Add(1) go BuyTicket() } wg.Wait() fmt.Printf(&amp;quot;卖出票数: %d\n&amp;quot;, num) } func BuyTicket() { defer wg.Done() for i := 1; i &amp;lt;= 10000; i++ { mutex.Lock() num++ mutex.Unlock() } } </code></pre>

页面列表

ITEM_HTML