7

我已经开始在 Android 中绘制图形了。那里有很多示例应用程序,但我经常看到的一件事是 lockCanvas。有人可以更详细地解释一下,因为我真的不明白,而且我认为理解未来的编程很重要?

一个例子:

try { 
    c = panel_thread.getHolder().lockCanvas(null);
    synchronized (panel_thread.getHolder()) {
        panel_thread.update();
        panel_thread.onDraw(c);
    }
}

这就是我现在所拥有的。我应该如何解释这个正确的?同步有什么作用?为什么将画布对象分配给 getHolder 和 lockCanvas 很重要?

这部分也令人困惑:

panel_thread.getHolder().unlockCanvasAndPost(c);

为什么这是必要的?我真的需要更详细的解释。:)

4

1 回答 1

13

synchronized表示一次只有一个线程可以执行该代码块。

在这个例子中,如果没有synchronized块,多个线程可能同时绘制图形,结果可能会很混乱。因此,synchronized确保一次只能绘制一个线程。

lockCanvas()创建一个您将写入的表面区域。之所以调用它,lockCanvas()是因为在您调用之前,在您的代码完成之前,unlockCanvasAndPost()没有其他代码可以调用lockCanvas()和写入表面。

一般来说,理解锁很重要,特别是当它与多线程编程相关时。锁是一种同步原语,用于防止多个线程同时访问资源/代码。它之所以得名,是因为它的行为很像物理锁。一般一个线程可以获得锁,直到释放锁,其他线程才能获得锁。使用锁的一个潜在问题是滥用它会导致“死锁”情况,其中线程等待锁,并且永远不会释放。

于 2010-07-23T20:42:25.220 回答