线程池技术积累

1.当chanel的作用只用来阻塞,不需要传递数据时:

    只需要c:=make(chan struct{}),构建空结构体可以减小内存消耗。

    阻塞goroutine时可以直接c<-struct{}{}不要忘了两个花括号。

 

2.chanel内存消耗:当我们的超时控制上下文的阻塞chanel(取名为done)没有设定长度的时候,我们的所有线程都会卡住。

         但当我们设定了长度的时候(设置为1),我们的goroutine放了空结构体进入管道时就会继续执行,不会阻塞。重点在这里,当我们的goroutine的函数处理完    的时候(也就是出栈的时候),gc会把chanel清理掉,所以不会一直卡住.

3.struct指针和非指针方法的区别:

    将结构体绑定到函数上,其实就是c语言上的将结构体作为第一个参数隐形的传递到方法里面。

        非指针:非指针也就是值的形式,将该结构体复制一份传递到方法里面。其实,当我们将非指针与方法绑定时,golang会自动创建指针绑定方法(与非指针同名)

            也就是说,我们在创建了func (t T)funtion(){}的时候,我们会自动拥有func (t *T)funtion(){}

        指针:将指向该结构体的指针复制到方法里面(也就是传递地址)

        指针与非指针也引出了方法集的概念。golang的结构体绑定的非指针和指针方法被称为方法集

        当你自定义的结构体里面又锁的时候,若是为这个绑定非指针的方法。那么会将结构体对象复制传递进方法,也就意味着,对不同的对象用了不同的锁。会造成死锁

 

 

 

 

        

 

posted @ 2022-05-27 22:03  丁庄主啊  阅读(19)  评论(0编辑  收藏  举报