如果同时发生的两个事件会改变变量的值,会发生什么?
例如,我们有两个对象:A
和B
,加载到stage
和一个名为varx
的阶段变量。
以下代码嵌入A
的第五帧:
stage.varx = 9
另一方面,我们在B
的第五帧中有以下代码:
stage.varx = 2
那么,当两个MovieClip都达到第五帧时,它会是varx
的值是什么?
答案 0 :(得分:1)
<强> TL; DR 强>
A
和B
不会在同一时间进入第五帧,除非你做了一些非常不寻常的事情。 A
或B
将首先到达它,而最后一个将覆盖第一个值。只要确保你没有depend
以某种顺序触发它们。即使你做了一些与众不同的事情,它仍然基本上没有问题。
假设您在舞台上引用了包含多个对象的单个程序,则可以回答这个问题。如果您正在谈论尝试共享某种全局stage
状态的多个程序(我不确定它们是否会共享相同的stage
对象),那么我不能肯定地说,但它很可能会以同样的方式运作。
Flash 通常不使用多线程。事实上,直到两年前,AS3根本没有支持它,给予或接受。 99%的时间,swfs根本不会使用它。
在这种情况下,A
和B
不会同时进入第五帧。这是不可能的。一个人必须首先进入第五个框架,然后进入另一个框架。它需要多线程才能在单个程序中改变这一事实。
所以,让我们说你有事件处理程序,当每个进入第五帧时会触发。这将是会发生的事情:
stage
变量设置为您为该特定处理程序提供的任何值。关于AS3中的事件的一件事是,它们并不像您刚开始时所期望的那样与语言的中心核心紧密相关。他们只是&#34;通常的API&#34;中的一个类。已经完全围绕它们构建了API的一部分。所以当你处理一个事件时,所有真正发生的事情就是某些代码突然决定它要派遣一个事件。然后它创建了一个类Event
的实例,然后它调用了一个名为dispatchEvent
的函数,并将Event
作为参数传入。然后dispatchEvent
只查看一个回调函数列表并开始一个接一个地调用它们,将Event
作为参数传递给它们。其中一个回调是你的事件处理程序。一个回调称为并返回,然后是下一个,然后是下一个。因此,事件处理作为一个整体是异步的,事件的调度和处理是以基本同步的方式进行的。
一次性一项规则的例外是当你在更现代版本的Flash中使用工作线程时。这实际上可能比多线程(可以说是两者的混合)更接近多处理,因为它实际上需要使用辅助的嵌入式swf,它们通过主swf通过&#34; workers&#34;进行通信。所以,是的,你可能会遇到这种情况,他们都试图同时混淆同一个变量。
这是计算机科学中一个非常普遍的问题,但简短的回答是:你编写的平台,无论是Flash还是.NET或其他什么,通常都是为了阻止你的能力从两个不同的源在相同的时间写入完全相同的变量和/或存储器地址。除非您决定采用更低级别,否则通常可以假设平台内部具有自己的锁定机制,这将阻止同时写入。这几乎肯定适用于此。
然而,有两点需要注意:
这适用于一个特定变量/内存地址。它不一定适用于,比方说,整个字符串的内部状态。在像C ++这样的语言中使用多线程的教科书问题是,如果两个线程试图在同一个确切的时间在同一个精确的字符串变量上连接。在C ++中,一个字符串实际上是一个chars
(或一个实例std::string
的数组,它将是一个包装器)只有当它到达一个整数值为0
的元素时才会结束。因此,尝试向字符串添加字符的两个线程可能会在稍微不同的时间开始,两者都在第一个完成之前开始,此时第二个线程将更改字符x
的值,而第一个线程将更改字符x + y
的值。但是,在高级语言中,通常会针对字符串的情况专门构建保护措施,但是当在给定对象中更改多个变量时,您仍然可以轻松地遇到此问题。
比赛条件。 Vesper触及了这一点。虽然A
和B
可能不会在同一时间更改stage.x
,但您仍然不太了解他们将要更改的顺序。而且它不会在Flash中或大多数其他任何内容中构建到平台中。如果你有任何异步的东西,即使它只是在表面和单线程环境中,你必须在那里放置逻辑以确保其他东西不依赖于它在任何特定的订单。
这通常与计算机科学有关。您可能已经知道了大部分内容,但基本上答案是stage.x
不会发生任何异常情况;只是你不能告诉哪个值会先到或过去。
答案 1 :(得分:0)
A
到达第五帧时stage.varx
成为9
stage.varx = 9
B
到达第五帧时stage.varx
成为2
stage.varx = 2
我们假设A
排在第一位,B
ccomes排在第二位,那么该值将为2,就像我们分配
var i:int = 2;
var i:int = 3;
//output i = 3
简单就是那个