Golang - 什么是Channel,帶緩沖區和不帶緩沖區的區別,為什么它可以做到線程安全


Channel的理解

Channel是Go中的一個核心類型,可以把它看成一個管道,通過它並發核心單元就可以發送或者接收數據進行通訊(communication),Channel也可以理解是一個先進先出的隊列,通過管道進行通信

Golang的Channel,發送一個數據到Channel和從Channel接收一個數據都是原子性的。

Go的設計思想就是,不要通過共享內存來通信,而是通過通信來共享內存,前者就是傳統的加鎖,后者就是Channel。

也就是說,設計Channel的主要目的就是在多任務間傳遞數據,所以本身就是安全的。

 

帶緩沖區和不帶緩沖區的區別

1)緩沖區大小不同

不帶緩沖區的chan緩沖區大小是0,帶緩沖區的chan緩沖區至少是1

2)運行方式不同

帶緩沖區的channel:【同步

寫入阻塞條件:緩沖區滿;
取出阻塞條件:緩沖區沒有數據。

不帶緩沖區的channel:【異步

寫入阻塞條件:同一時間沒有另外一個線程對該chan進行讀操作;
取出阻塞條件:同一時間沒有另外一個線程對該chan進行寫操作。

channel存在3種狀態

nil:未初始化的狀態,只進行了聲明,或者手動賦值為nil,nil狀態的chan是不能closepanic: close of nil channel);
active:正常的channel,可讀或者可寫 ;
closed:已關閉,千萬不要誤認為關閉channel后,channel的值是nil,關閉的狀態的chan仍然可以讀值(取值)但不能寫值(會報panic: send on closed channel)。

func main() { var a chan int fmt.Println(a) // <nil>
    a = make(chan int) close(a) fmt.Println(a) // 0xc00003e060
}

channel可進行3種操作

總結

發生 panic 的情況有三種:向一個關閉的 channel 進行寫操作;重復關閉一個 channel;關閉一個 nil 的 channel。

發生 阻塞(死鎖)的情況:讀、寫一個 nil的 channel。 

對未初始化的的chan進行讀(接收)寫(發送),會怎么樣?為什么?【查看原文

對已經關閉的chan進行讀寫,會怎么樣?為什么?【查看原文


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM