老师,在10分21秒的时候,为什么要把TempPacket赋值给一个packet变量,对packet变量进行操作,而不是直接对TempPacket进行操作?

来源:8-8 构建有序消息体-基本接收调度实现-2

慕粉0027932

2019-05-29

赋值给一个临时变量,然后都临时变量进行操作有什么好处么?

写回答

1回答

Qiujuer

2019-05-29

你说的是这个吧:
//img.mukewang.com/szimg/5ceea04b0001f94b06540130.jpg


这算是随手为之的写法吧。已经深入骨髓,随手就爱这么写了。

一般来说遇到这样的场景,拿到某个变量,操作某些东西后会把变量设置为null的情况下,我都会这样做;或者说在其他地方有对这个变量进行设置的方法时,我也会这么做。


这样的目的在于,在多线程情况下,避免操作的变量发生变化导致意外的BUG。

比如此时变量指向了实例A,此时我需要两步进行操作,第一步:判断变量:

if(packetTemp!=null)

那么这个判断可能是通过了,然后我们就需要对这个变量进行某些操作了,比如调用他的方法啥的:

第二步:

packetTemp.send()

但是,这个操作,并不是立刻发生,在我们判断过的情况下,可能存在CPU切换去做其他事情;比如此时刚好就有一个方法对其进行设置:

步骤三:

void set(Packet packet){
packetTemp = packet;
}

也就是说我们最开始是实例A,我们也经过了第一步判断;但是在进行第二步处理前,CPU去做其他事情了,比如就进行了:步骤三。


执行完成后回来:那么顺序就是:第一步->步骤三->第二步


但是,但是,但是此时的packetTemp已经不是之前的实例A了,所以第二步的操作将得不到我们想要的结果;此时packetTemp可能是空,或者其他实例;反正都会导致问题出现。


所以我一般会采用上面的做法,存为局部变量,这样避免上述的问题。不管是否有在多线程情况下,我都会这样处理,而且存为局部变量后操作,会比直接操作全局变量更加快速。

1
4
慕粉0027932
回复
Qiujuer
好的~
2019-05-30
共4条回复

Socket网络编程进阶与实战 系统掌握Socket核心技术

理论+实践,系统且深入掌握Socket核心技术,从容应对各种Socket应用场景的不二之选

2314 学习 · 476 问题

查看课程