• 属鱼
    2018-10-10
    第一个问题:
    Lock接口。
    第二个问题:
    变量.Rlock()
    
     16
  • Geek_cd5dcf
    2018-10-11
    讲的通俗易懂,还是挺好理解的,想问下mutex如果加锁后
    mutex.lock()
    defer mutex.unlock()
    在所有场景下都不会出错吗?

    作者回复: 对,不会,这是defer的机制保证的。

     1
     12
  • 🤔
    2019-03-16
    1. Locker 接口
    2. func (rw *RWMutex) RLocker() Locker

    作者回复: √

    
     6
  • 阳仔
    2019-04-03
    学习将近一半的课程了发现:
    1. 内容不够简洁,很多知识点其实画图出来更容易让读者理解
    2. 感觉不大适合初学者,反而对已经入门有一定经验的学习者会帮助更大一些
    3. 可以看出来作者是非常精通go的
    
     3
  • sky
    2018-10-22
    郝大 关于demo59这个案例能大概描述下具体的功能流程吗 代码看起来没有方向感啊
     1
     3
  • 安排
    2019-09-22
    goroutine和协程有什么本质区别啊,搜了网上也没看出来啥本质区别,有这方面的资料吗?

    作者回复: 传统的协程只是线程内的流程控制工具。它没法做到一个线程内有两个及以上控制流同时进行,只能是这一个挂起那一个运行然后那一个挂起这一个再运行。同时它也不属于多线程编程,没法统一调度多个线程内的控制流。

    goroutine 我就不用多说了,它属于用户级线程,与系统级线程搭配使用,很强大也很灵活。深入的东西可以看我的那本《Go 并发编程实战》。

    
     2
  • Hector
    2019-05-16
    读写锁总结,1、可以随便读,即使加锁多个goroutine同时读 2、加锁写的时候,啥也不能干,不能写。即使没加读锁也不能读。老师写的有点绕蒙了。
    引用原文:对写锁进行解锁,会唤醒“所有因试图锁定读锁,而被阻塞的 goroutine”,并且,这通常会使它们都成功完成对读锁的锁定。意思就是在对资源的写锁进行解锁时,原来你在对该资源上写锁的时候,所有的读锁会锁定来配合写操作,直到写锁解除锁定时,这些读锁才会解锁。
     1
     2
  • Leon📷
    2018-11-13
    老师,我想问下多协程并发情况怎么调试日志,google官方似乎也不推荐我们在日志中把协程号打印出来,只能通过添加唯一序列号识别吗
     1
     2
  • CcczzZ
    2020-01-16
    老师,有个疑问,文中说的这句:「对读锁进行解锁,只会在没有其他读锁锁定的前提下,唤醒“因试图锁定写锁,而被阻塞的 goroutine”」。
    我的理解是,对读锁进行解锁时,此刻若存在其他读锁等待的话,是会优先唤醒读锁的,如果不存在其他等待的读锁,才会唤醒写锁。不知道这样理解是否正确?

    而基于上面的理解,我写了段代码测试了一下,发现结果并不是这样,实际情况是:「当读锁进行解锁时,若此刻存在其他的读锁和写锁,会根据他们实际阻塞等待的时间长短,优先唤醒并执行」
    就像下面,写锁在前面执行,等待的时间也比读锁场,所以当读锁解锁时,优先唤醒的是等待时间较长的写锁。

    func main() {

        var rwMu sync.RWMutex

        // 模拟多个写/读锁进行阻塞,当释放读锁的时候看谁先获取到锁(会在没有其他读锁的时候,唤醒写锁)

        rwMu.RLock()
        fmt.Println("start RLock")

        // 写
        go func() {
            defer func() {
                rwMu.Unlock()
                fmt.Println("get UnLock")
            }()
            rwMu.Lock()
            fmt.Println("get Lock")
        }()
        time.Sleep(time.Millisecond * 200)

        // 读
        go func() {
            defer func() {
                rwMu.RUnlock()
                fmt.Println("get RUnLock")
            }()
            rwMu.RLock()
            fmt.Println("get RLock")
        }()
        time.Sleep(time.Millisecond * 200)

        rwMu.RUnlock()
        fmt.Println("start RUnLock")
        time.Sleep(time.Second * 1)
    }

    运行结果(等待时间较长的写操作先执行了):
    start RLock
    start RUnLock
    get Lock
    get UnLock
    get RLock
    get RUnLock
    展开

    作者回复: 简单一句话:读写锁中的读锁锁定操作之间是不互斥的。另外,对于读写锁,读锁锁定操作会与写锁锁定操作互斥,写锁锁定操作之间也会互斥。

     1
     1
  • 芝士老爹
    2019-08-04
    如果一直有新的读锁请求,会不会导致写锁锁不了?
    还是说如果有了一个wlock锁请求了,现在因为有rlock未释放锁,wlock的协程被阻塞,后面再有新的rlock锁请求也会先被阻塞,等待wlock锁协程先恢复?

    作者回复: 那要看谁先等待了,这里的等待队列是先进先出的。

     2
     1
  • jacke
    2018-11-07
    问下老师,读写锁解锁部分有点不明白:写锁解锁的时候如果同时有写锁和读锁在等待,是优先唤醒读锁是把?
    这个规定对读锁解锁也适用是把?
     1
     1
  • timmy21
    2018-10-15
    郝老师,之前问了一个是否需要上锁的问题。有一个细节我忘说了,一个写者,一个读者,并且“读者”读取变量时不需要保证返回最新值。这种场景下是否可以不上锁?或者不上锁会有什么问题吗?会panic吗?
     2
     1
  • Geek_b5876e
    2020-01-19
    通过strace观察了一下锁的系统调用,发现了 futex ,go 语言锁的实现也是依赖于操作系统原语和信号量的
    
    
  • 疯琴
    2019-11-25
    讲得挺清晰的
    
    
  • 大王叫我来巡山
    2019-09-13
    需要请教老师的是,主协程收到信号就被唤醒了,认为可以读了,但是被阻塞的写协程收到锁释放的消息会不会比主协程要早,然后继续获得写的机会,主协程会不会被阻塞?我认为是不会的,此处的锁只是保证了不同写协程互斥的写入,也就是写操作是原子的,但是并不保证读操作一定在写完后就读吧

    作者回复: 对于非缓冲通道,写的 goroutine 必然会先完成操作。锁本身只保证互斥。被阻塞的 goroutine 也会有先有后,但会根据被阻塞那一刻的先后,而不是什么读写的先后。

    另外互斥锁跟原子操作有本质上的区别,不要搞混。

    再另外,goroutine 与协程也有本质上的区别,不要搞混。

     1
    
  • 糊李糊涂
    2019-06-12
    Locker和RLocker
    
    
  • soooldier
    2019-05-31
    配套代码里puzzlers/article26下并没有demo58.go,也没有demo59.go,懵圈中。。。

    作者回复: 看这里吧:https://github.com/hyper0x/Golang_Puzzlers/tree/master/src/puzzlers/article22

    你可以把这里的 article 理解成 topic。一些比较长的 topic 可能会被编辑拆分为多篇文章,所以就出现了这种情况。太长的文章对读者们不太友好,不容易集中精力读下去。

    你可以对照着专栏的目录,按照主题,找一下对应的 articleXX 目录。

    Update:
    我刚刚添加了一个序号映射表:https://github.com/hyper0x/Golang_Puzzlers/blob/master/mapping_table.md 。你用这个就可以方便地对照了。

    
    
  • 张sir
    2019-05-05
    一组临界区是什么场景下会,能举个例子吗?

    作者回复: 你可以理解为同一把锁保护的多个代码段。

    
    
  • ...
    2019-02-20
    老师 go有没有可重入锁的概念

    作者回复: 这里说的就是可重入锁啊。

     2
    
  • 静以储势·Shuke
    2018-12-05
    Golang可以用mutex像java一样嵌套加锁么?
     2
    
我们在线,来聊聊吧