请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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

正在回答

1回答

你说的是这个吧:
https://img1.sycdn.imooc.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 回复 有任何疑惑可以回复我~
  • 提问者 慕粉0027932 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2019-05-30 09:18:38
  • 提问者 慕粉0027932 #2
    谢谢老师,总结来说就是,避免由于被操作的变量可能被改变,而将该变量赋值给另一个局部变量,对局部变量进行操作。其实我在看jdk的源码的时候也发现了很多这样的做法,之前一直觉得不理解。现在理解了。不是冗余就好~
    回复 有任何疑惑可以回复我~ 2019-05-30 09:21:32
  • Qiujuer 回复 提问者 慕粉0027932 #3
    嘿嘿,给个好评喽~~谢谢?;有问题随时提问,或者QQ找我哈。
    回复 有任何疑惑可以回复我~ 2019-05-30 09:39:06
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信