Java 与 Go 的不同(1)

Java通过共享内存来通信,Go通过通信(channel)来共享内存。
Java通过加锁避免多线程并发冲突,Go通过channel实现数据流转协程A只负责发数据,协程B只负责接收数据,数据的控制权自动由A转交至B,实现解耦,数据随消息自然流转。

func download(url string, ch chan string) {
    // 1. 协程自己干活,不碰别人的内存
    res := "data from " + url 
    
    // 2. 不要去改某个全局的数组(共享内存)
    // 3. 而是通过“通信(Channel)”把结果发出去
    ch <- res 
}

func main() {
    ch := make(chan string)
    go download("a.com", ch)
    
    // 4. 主协程通过“接收消息”获得了数据的所有权
    msg := <-ch 
    fmt.Println(msg)
}

更安全: 既然数据不再被多个线程同时乱改,就不需要担心 Race Condition(竞态条件)。

更解耦: A 只管发,B 只管收。它们不需要知道对方是谁,只需要守好这个 Channel。

心态转变: Java 程序员转 Go,最大的门槛不是语法,而是从“加锁保护数据”转变为“用管道流动数据”。
channel本质是“阻塞队列”

posted @ 2026-04-05 23:42  Nickey103  阅读(2)  评论(0)    收藏  举报