Android同步?

时间:2011-06-25 20:59:21

标签: android opengl-es

我不完全了解同步块正在做什么以及为什么有必要。 有人可以用“同步傻瓜”的方式解释一下吗?

在我正在阅读的一本书中,作者告诉我“同步是必要的,因为我们在其中操纵的成员 可以在UI线程的onPause()方法中操作synchronized块。“ 他创建了一个名为stateChanged的Object,并将其实例化为一个新对象。 然后,在同步块中,他使用stateChanged对象作为参数。 这一切都让我失望,我不想继续前进,直到我对发生的事情有了很好的理解。

3 个答案:

答案 0 :(得分:1)

要阅读的书是Java Concurrency in Practice。

你应该把这个想法与Android分开,虽然你的代码将在Dalvik上运行,这是一个Java概念。不是Android版。

synchronized块将一个对象作为参数,任何对象,当流进入synchronized块的主体时,运行到具有与参数相同的实例(对象)的synchronized块的任何其他线程必须等待为前一个完成。这是一个非常基本的描述。

这是计算机科学的一个完整子领域,如果没有认真的学习,你可能不会理解它。

答案 1 :(得分:1)

经典的例子是:假设您有两个操作线程,并且它们都引用相同的方法:

public void addToGlobalVar(int y) {
int x = globalVar;  //what if a thread stops right after this line?
x += y;
globalVar = y;
}

其中globalVar是此方法可以与之交互和设置的其他预定义数字。可以说globalVar是50。

线程在某种程度上随意获得计算时间,所以你永远不会完全知道一个停止的精确纳秒,另一个获得CPU时间。

在此示例中,如果除了UI线程之外还启动了AsyncTask,并且在某些时候都使用了addToGlobalVar(10),那么可能会发生一个线程可能在该代码块的第2行中断。如果另一个线程正在通过,那么它将成功地将globalVar设置为60.但是当另一个线程唤醒时,它仍然认为x = 50,然后它将其设置为60.所以本质上你只是50 + 10 + 10 = 60.希望你能看出这是怎么回事。

你可以通过使计算成为原子来解决这个简单的例子(跳过声明x,1行,完成所有计算)或者如果逻辑不能被压缩到1行,你可以使用一个代码块原子synchronized

答案 2 :(得分:0)

在使用之前,您必须完全理解它。它是使用面向对象监视器的标准android同步。您必须了解它才能编写多线程程序,但它在某种程度上已经过时了(更好地使用java.util.concurrent来代替相关的任何线程/同步)。

无论如何 - 你需要知道它是什么 - 阅读相关的java教程部分:

http://download.oracle.com/javase/tutorial/essential/concurrency/sync.html