美文网首页
Go-channel锁机制

Go-channel锁机制

作者: 骑蜗上高速 | 来源:发表于2019-12-26 15:18 被阅读0次

死锁:
1、单goroutine自己死锁
channel应该至少在两个以上的goroutine中进行通信,否则死锁
代码示例:

package main
import "fmt"
func main () {
    ch := make(chan int)
    ch <- 88
    num :=<- ch
    fmt.Println("读到",num)
}

输出结果:

fatal error: all goroutines are asleep - deadlock!

2、goroutine之间channel访问顺序导致死锁
使用channel一端读(写),需要保证另一端写(读)
示例代码:

package main
import "fmt"
func main () {
    ch := make(chan int)
    num :=<- ch
    go func() {
        ch <- 88
    }()

    fmt.Println("读到",num)
}

输出结果:

fatal error: all goroutines are asleep - deadlock!

正确的顺序是:

package main
import "fmt"
func main () {
    ch := make(chan int)
    go func() {
        ch <- 88
    }()
    num :=<- ch
    fmt.Println("读到",num)
}

结果:

读到 88

3、多goroutine,多channel交叉死锁。channel和mutex同时使用会产生交叉死锁。

package main
func main () {
    ch1 := make(chan int)
    ch2 := make(chan int)
    go func() {
        for {
            select {
            case num1 := <- ch1:
                ch2 <- num1
            }
        }
    }()
    for {
        select {
        case num2 := <- ch2:
            ch1 <- num2
        }
    }
}

输出结果:

fatal error: all goroutines are asleep - deadlock!

4、在go中,尽量不要将互斥锁、读写锁与channel混用 ------隐性死锁 。

相关文章

  • Go-channel锁机制

    死锁:1、单goroutine自己死锁channel应该至少在两个以上的goroutine中进行通信,否则死锁代码...

  • 数据库为什么需要锁机制?有哪些锁机制?

    数据库为什么需要锁机制?有哪些锁机制?

  • 锁机制

    锁机制

  • MySQL 锁

    MySQL的锁机制 不同的存储引擎支持不同的锁机制 MyISAM和MEMORY存储引擎采用的是表级锁(table-...

  • java Thread深入了解(四)

    概念介绍 悲观锁是指假设并发更新冲突会发生,所以不管冲突是否真的发生,都会使用锁机制。相对悲观锁而言,乐观锁机制采...

  • java Thread深入了解(四)

    概念介绍 悲观锁是指假设并发更新冲突会发生,所以不管冲突是否真的发生,都会使用锁机制。相对悲观锁而言,乐观锁机制采...

  • 锁机制

    基础知识之一:锁的类型 锁从宏观上分类,分为悲观锁与乐观锁。 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并...

  • 锁机制

    一、说说线程安全问题,什么是线程安全,如何保证线程安全 http://www.jasongj.com/java/t...

  • 锁机制

    ReentrantLock可重入锁:就是一个线程在获取了锁之后,再次去获取了同一个锁,这时候仅仅是把状态值进行累加...

  • 锁机制

    锁机制 Innodb是事务级数据库,支持事务,支持外键,rollback,mvcc(高并发:在readcommit...

网友评论

      本文标题:Go-channel锁机制

      本文链接:https://www.haomeiwen.com/subject/vhtloctx.html