在 Actionscript 3 中,如果不同的事件同时更改变量的值会发生什么情况?
In Actionscript 3, what happens if different events change the value of a variable at the same time?
如果同时发生的两个事件改变了一个变量的值会怎样?
例如,我们有两个对象:A
和 B
,加载到 stage
和一个名为 varx
.
的阶段变量
以下代码嵌入在A
的第五帧中:
stage.varx = 9
另一方面,在B
的第五帧中,我们有以下代码:
stage.varx = 2
那么,当两个 MovieClip 都达到第五帧时,varx
的值是多少?
当A
到达第五帧时stage.varx
变为9
stage.varx = 9
当B
到达第五帧时stage.varx
变为2
stage.varx = 2
让我们假设 A
排在第一位,B
排在第二位,那么值将为 2 ,就像我们分配
var i:int = 2;
var i:int = 3;
//output i = 3
就这么简单
TL;DR
A
和 B
不会同时进入第五帧,除非你做了一些非常不寻常的事情。 A
或 B
将首先到达它,最后一个将覆盖第一个的值。只要确保你没有 depend
对他们按特定顺序开火。即使你做了一些不寻常的事情,它基本上仍然不是问题。
假设您指的是舞台上有多个对象的单个程序,就可以回答这个问题。如果您谈论的是多个程序试图共享某种全局 stage
状态(我不确定它们是否会共享相同的 stage
对象),那么我不能说当然可以,但它很可能会以同样的方式工作。
Flash 一般不使用多线程。事实上,直到大约两年前,AS3 才完全支持它。 99% 的时间,swfs 根本不会使用它。
那样的话,A
和B
就不会同时进入第五帧了。不可能。一个必须首先进入它的第五帧,然后是另一个。它需要多线程才能在单个程序中改变这一事实。
假设您有事件处理程序,当每个事件处理程序进入第五帧时都会触发。这就是将要发生的事情:
- 第一个进入该帧的人会这样做。
- 然后它会引发一个事件。
- 然后该对象的处理程序将捕获该事件。
- 然后您的处理程序会将
stage
变量设置为您为该特定处理程序提供的任何值。
- 然后,一旦完成所有操作,另一个对象将最终进入其第五帧。
关于 AS3 中的事件,有一点是它们与语言的中心核心的联系并不像您刚开始时所期望的那样紧密。它们只是 "usual API" 中的一个 class,API 的一部分完全围绕着它们构建。所以当你处理一个事件时,真正发生的只是一些代码突然决定它想要调度一个事件。然后它创建了一个 class Event
的实例,然后调用它的一个函数 dispatchEvent
,将 Event
作为参数传入。然后 dispatchEvent
只是查看回调函数列表并开始一个接一个地调用它们,将 Event
作为参数传递给它们中的每一个。这些回调之一是您的事件处理程序。一个回调称为 和 returns,然后是下一个,再下一个。因此,虽然事件处理作为一个整体是异步的,但事件的分发和处理基本上是以同步方式进行的。
一次一件事规则的例外是当您在更现代的 Flash 版本中使用工作线程时。这实际上可能比多线程(可以说是两者的混合)更接近多处理,因为它实际上需要使用辅助的嵌入式 swf,这些 swf 通过 "workers" 通过主 swf 进行通信。所以是的,你可能 运行 会遇到这样一种情况,他们都试图同时弄乱同一个变量。
这是计算机科学中一个非常普遍的问题,但简短的回答是:您在其上编程的平台,无论是 Flash 还是 .NET 或其他什么,通常都旨在阻止您能够从两个不同的源同时写入 完全相同的 变量 and/or 内存地址。除非你决定走低得多的级别,否则你通常可以假设该平台将在内部内置自己的锁定机制,以防止同时写入。这几乎肯定适用于此。
但是有两个注意事项:
这适用于一个特定的变量/内存地址。它不一定适用于,比方说,整个字符串的内部状态。像 C++ 这样的语言中的多线程教科书问题是,如果两个线程试图在同一时间连接同一字符串变量。在 C++ 中,字符串实际上是 chars
的数组(或实例 std::string
,它将围绕它进行包装),仅当它到达具有整数值 0
的元素时才结束.因此,尝试向字符串中添加字符的两个线程可能会在略有不同的时间开始,两个线程都在第一个线程完成之前开始,此时第二个线程将更改字符 x
的值,而第一个线程将更改字符 x
的值字符值 x + y
。虽然在高级语言中,通常有专门针对字符串情况内置的保护措施,但是当给定对象中的多个变量发生更改时,您仍然可以 运行 轻松进入此状态。
竞争条件。 Vesper 谈到了这一点。虽然 A
和 B
可能不会完全同时更改 stage.x
,但您仍然不太清楚他们将按什么顺序更改它。它不会被构建进入平台,无论是在 Flash 中还是在大多数其他任何东西中。当你有任何异步的东西时,即使它只是在表面上并且在单线程环境中,你也必须在那里放置逻辑以确保其他东西不依赖于它以任何特定顺序执行。
这通常适用于一般的计算机科学。你可能已经知道其中的大部分内容,但基本上答案是 stage.x
不会发生任何异常情况;只是您无法判断哪个值先出现或最后出现。
如果同时发生的两个事件改变了一个变量的值会怎样?
例如,我们有两个对象:A
和 B
,加载到 stage
和一个名为 varx
.
以下代码嵌入在A
的第五帧中:
stage.varx = 9
另一方面,在B
的第五帧中,我们有以下代码:
stage.varx = 2
那么,当两个 MovieClip 都达到第五帧时,varx
的值是多少?
当A
到达第五帧时stage.varx
变为9
stage.varx = 9
当B
到达第五帧时stage.varx
变为2
stage.varx = 2
让我们假设 A
排在第一位,B
排在第二位,那么值将为 2 ,就像我们分配
var i:int = 2;
var i:int = 3;
//output i = 3
就这么简单
TL;DR
A
和 B
不会同时进入第五帧,除非你做了一些非常不寻常的事情。 A
或 B
将首先到达它,最后一个将覆盖第一个的值。只要确保你没有 depend
对他们按特定顺序开火。即使你做了一些不寻常的事情,它基本上仍然不是问题。
假设您指的是舞台上有多个对象的单个程序,就可以回答这个问题。如果您谈论的是多个程序试图共享某种全局 stage
状态(我不确定它们是否会共享相同的 stage
对象),那么我不能说当然可以,但它很可能会以同样的方式工作。
Flash 一般不使用多线程。事实上,直到大约两年前,AS3 才完全支持它。 99% 的时间,swfs 根本不会使用它。
那样的话,A
和B
就不会同时进入第五帧了。不可能。一个必须首先进入它的第五帧,然后是另一个。它需要多线程才能在单个程序中改变这一事实。
假设您有事件处理程序,当每个事件处理程序进入第五帧时都会触发。这就是将要发生的事情:
- 第一个进入该帧的人会这样做。
- 然后它会引发一个事件。
- 然后该对象的处理程序将捕获该事件。
- 然后您的处理程序会将
stage
变量设置为您为该特定处理程序提供的任何值。 - 然后,一旦完成所有操作,另一个对象将最终进入其第五帧。
关于 AS3 中的事件,有一点是它们与语言的中心核心的联系并不像您刚开始时所期望的那样紧密。它们只是 "usual API" 中的一个 class,API 的一部分完全围绕着它们构建。所以当你处理一个事件时,真正发生的只是一些代码突然决定它想要调度一个事件。然后它创建了一个 class Event
的实例,然后调用它的一个函数 dispatchEvent
,将 Event
作为参数传入。然后 dispatchEvent
只是查看回调函数列表并开始一个接一个地调用它们,将 Event
作为参数传递给它们中的每一个。这些回调之一是您的事件处理程序。一个回调称为 和 returns,然后是下一个,再下一个。因此,虽然事件处理作为一个整体是异步的,但事件的分发和处理基本上是以同步方式进行的。
一次一件事规则的例外是当您在更现代的 Flash 版本中使用工作线程时。这实际上可能比多线程(可以说是两者的混合)更接近多处理,因为它实际上需要使用辅助的嵌入式 swf,这些 swf 通过 "workers" 通过主 swf 进行通信。所以是的,你可能 运行 会遇到这样一种情况,他们都试图同时弄乱同一个变量。
这是计算机科学中一个非常普遍的问题,但简短的回答是:您在其上编程的平台,无论是 Flash 还是 .NET 或其他什么,通常都旨在阻止您能够从两个不同的源同时写入 完全相同的 变量 and/or 内存地址。除非你决定走低得多的级别,否则你通常可以假设该平台将在内部内置自己的锁定机制,以防止同时写入。这几乎肯定适用于此。
但是有两个注意事项:
这适用于一个特定的变量/内存地址。它不一定适用于,比方说,整个字符串的内部状态。像 C++ 这样的语言中的多线程教科书问题是,如果两个线程试图在同一时间连接同一字符串变量。在 C++ 中,字符串实际上是
chars
的数组(或实例std::string
,它将围绕它进行包装),仅当它到达具有整数值0
的元素时才结束.因此,尝试向字符串中添加字符的两个线程可能会在略有不同的时间开始,两个线程都在第一个线程完成之前开始,此时第二个线程将更改字符x
的值,而第一个线程将更改字符x
的值字符值x + y
。虽然在高级语言中,通常有专门针对字符串情况内置的保护措施,但是当给定对象中的多个变量发生更改时,您仍然可以 运行 轻松进入此状态。竞争条件。 Vesper 谈到了这一点。虽然
A
和B
可能不会完全同时更改stage.x
,但您仍然不太清楚他们将按什么顺序更改它。它不会被构建进入平台,无论是在 Flash 中还是在大多数其他任何东西中。当你有任何异步的东西时,即使它只是在表面上并且在单线程环境中,你也必须在那里放置逻辑以确保其他东西不依赖于它以任何特定顺序执行。
这通常适用于一般的计算机科学。你可能已经知道其中的大部分内容,但基本上答案是 stage.x
不会发生任何异常情况;只是您无法判断哪个值先出现或最后出现。