- 源碼位置 net/rpc/server.go
數(shù)據(jù)結(jié)構(gòu)
// Server represents an RPC Server.
type Server struct {
serviceMap sync.Map // map[string]*service
reqLock sync.Mutex // protects freeReq
freeReq *Request
respLock sync.Mutex // protects freeResp
freeResp *Response
}
// 成員函數(shù)
func (server *Server)freeRequest(req *Request)
func (server *Server)getRequest() *Request {
server.reqLock.Lock()
req := server.freeReq
if req == nil {
req =new(Request)
}else {
server.freeReq = req.next
//錯(cuò)誤, 此處新建了Request,取代了req原始指向的對(duì)象拥刻, 應(yīng)該刪除此行,直接返回req, 達(dá)到Request對(duì)象復(fù)用的效果
*req =Request{}
}
server.reqLock.Unlock()
return req
}
在結(jié)構(gòu)體Server中維護(hù)了freeReq, freeResp鏈表铣减,用于復(fù)用request和response者铜。 但是在getRequest函數(shù)里, 源碼中將freeReq頭節(jié)點(diǎn)指向第二個(gè)節(jié)點(diǎn)域仇, 并新建了一個(gè)Request{}作為結(jié)果返回刑然。正確的做法應(yīng)該是將頭節(jié)點(diǎn)從鏈表中刪除,然后將頭節(jié)點(diǎn)返回暇务,從而達(dá)到對(duì)象復(fù)用的效果泼掠。