老师,在10分21秒的时候,为什么要把TempPacket赋值给一个packet变量,对packet变量进行操作,而不是直接对TempPacket进行操作?
来源:8-8 构建有序消息体-基本接收调度实现-2
慕粉0027932
2019-05-29
赋值给一个临时变量,然后都临时变量进行操作有什么好处么?
写回答
1回答
-
你说的是这个吧:
这算是随手为之的写法吧。已经深入骨髓,随手就爱这么写了。
一般来说遇到这样的场景,拿到某个变量,操作某些东西后会把变量设置为null的情况下,我都会这样做;或者说在其他地方有对这个变量进行设置的方法时,我也会这么做。
这样的目的在于,在多线程情况下,避免操作的变量发生变化导致意外的BUG。
比如此时变量指向了实例A,此时我需要两步进行操作,第一步:判断变量:
if(packetTemp!=null)
那么这个判断可能是通过了,然后我们就需要对这个变量进行某些操作了,比如调用他的方法啥的:
第二步:
packetTemp.send()
但是,这个操作,并不是立刻发生,在我们判断过的情况下,可能存在CPU切换去做其他事情;比如此时刚好就有一个方法对其进行设置:
步骤三:
void set(Packet packet){ packetTemp = packet; }
也就是说我们最开始是实例A,我们也经过了第一步判断;但是在进行第二步处理前,CPU去做其他事情了,比如就进行了:步骤三。
执行完成后回来:那么顺序就是:第一步->步骤三->第二步
但是,但是,但是此时的packetTemp已经不是之前的实例A了,所以第二步的操作将得不到我们想要的结果;此时packetTemp可能是空,或者其他实例;反正都会导致问题出现。
所以我一般会采用上面的做法,存为局部变量,这样避免上述的问题。不管是否有在多线程情况下,我都会这样处理,而且存为局部变量后操作,会比直接操作全局变量更加快速。
142019-05-30
相似问题