<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 互斥鎖 慣例來說,被mutex所保護的變量是在mutex變量聲明之后立刻聲明的。如果你的做法和慣例不符,確保在文檔里對你的做法進行說明。 ## 阻塞 調用mutex的Lock方法來獲取一個互斥鎖。如果其它的goroutine已經獲得了這個鎖的話,這個操作會被阻塞直到其它goroutine調用了Unlock使該鎖變回可用狀態。mutex會保護共享變量。 也就是說,當一個協程獲得了鎖之后,其它協程就會阻塞住,直到獲取鎖的協程unlock了. ## 臨界區 在Lock和Unlock之間的代碼段中的內容goroutine可以隨便讀取或者修改,這個代碼段叫做臨界區。 ## 互斥鎖中使用defer 下面的例子里Unlock會在return語句讀取完balance的值之后執行,所以Balance函數是并發安全的。這帶來的另一點好處是,我們再也不需要一個本地變量b了。 **一個deferred Unlock即使在臨界區發生panic時依然會執行**,這對于用recover來恢復的程序來說是很重要的。defer調用只會比顯式地調用Unlock成本高那么一點點,不過卻在很大程度上保證了代碼的整潔性。大多數情況下對于并發程序來說,代碼的整潔性比過度的優化更重要。如果可能的話盡量使用defer來將臨界區擴展到函數的結束。 **這也就解釋了,為什么defer被設計的在return之后才會執行,因為defer的操作,不想去影響正常的業務邏輯.** ~~~ func Balance() int { mu.Lock() defer mu.Unlock() return balance } ~~~ ## 死鎖 對一個已經上鎖的數據,再次上鎖會造成死鎖. 可以在看go語言圣經的這一段.蠻精彩的. ## 封裝性 封裝, 用限制一個程序中的意外交互的方式,可以使我們獲得數據結構的不變性。因為某種原因,封裝還幫我們獲得了并發的不變性。當你使用mutex時,確保mutex和其保護的變量沒有被導出(在go里也就是小寫,且不要被大寫字母開頭的函數訪問啦),無論這些變量是包級的變量還是一個struct的字段。 **上面的意思是,無論是被保護的數據,還是mutex鎖本身,都不要能被變量直接訪問到**.
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看