## 一、怎么查看Goroutine的数量 GOMAXPROCS中控制的是未被阻塞的所有Goroutine,可以被Multiplex到多少个线程上运行,通过GOMAXPROCS可以查看Goroutine的数量。 ## 二、读写锁或者互斥锁读的时候能写吗? Go中读写锁包括读锁和写锁,多个读线程可以同时访问共享数据;写线程必须等待所有读线程都释放锁以后,才能取得锁;同样的,读线程必须等待写线程释放锁后,才能取得锁,也就是说读写锁要确保的是如下互斥关系,可以同时读,但是读-写,写-写都是互斥的。 ## 三、Channel是同步的还是异步的 Channel是异步进行的。 channel存在3种状态: * nil,未初始化的状态,只进行了声明,或者手动赋值为nil * active,正常的channel,可读或者可写 * closed,已关闭,千万不要误认为关闭channel后,channel的值是nil ## 四、说一下异步和非阻塞的区别? ## 1、 异步和非阻塞的区别: * 异步:调用在发出之后,这个调用就直接返回,不管有无结果;异步是过程。 * 非阻塞:关注的是程序在等待调用结果(消息,返回值)时的状态,指在不能立刻得到结果之前,该调用不会阻塞当前线程。 ## 2、同步和异步的区别: * 同步:一个服务的完成需要依赖其他服务时,只有等待被依赖的服务完成后,才算完成,这是一种可靠的服务序列。要么成功都成功,失败都失败,服务的状态可以保持一致。 * 异步:一个服务的完成需要依赖其他服务时,只通知其他依赖服务开始执行,而不需要等待被依赖的服务完成,此时该服务就算完成了。被依赖的服务是否最终完成无法确定,一次它是一个不可靠的服务序列。 ## 3、 消息通知中的同步和异步: * 同步:当一个同步调用发出后,调用者要一直等待返回消息(或者调用结果)通知后,才能进行后续的执行。 * 异步:当一个异步过程调用发出后,调用者不能立刻得到返回消息(结果)。在调用结束之后,通过消息回调来通知调用者是否调用成功。 ## 4、阻塞与非阻塞的区别: * 阻塞:阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务,函数只有在得到结果之后才会返回。 * 非阻塞:非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。 同步与异步是对应的,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。 阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。 阻塞是使用同步机制的结果,非阻塞则是使用异步机制的结果。