我想了解一下我最近的多線程思想。這裏有:避免使用狀態變量副本進行阻塞?
假設我有以下(僞)類,它的run()
方法在某個線程上永遠徘徊。其他線程將在隨機時間使用setState()
更改Foo
實例的狀態。 run()
所做的工作只涉及讀取狀態變量,不寫入,並且在while語句的一次執行過程中(例如:繪製位圖),狀態不得更改。在這種情況下,擁有2個狀態變量副本似乎可以防止很多潛在的阻塞(因爲如果我只有一個共享狀態變量副本,我將不得不同步while循環中的所有內容(使用stateLock
)而外部線程可能沒有機會改變狀態)。代碼中斷後的問題。
class Foo {
Object stateLock = new Object();
private float my1, my2, my3;
private float sh1, sh2, sh3; // sh stands for shared
public void setState(...) {
synchronized (stateLock) {
// modify sh1, sh2, or sh3 here
}
}
private void updateState() {
synchronized (stateLock) {
// set my1=sh1, my2=sh2, my3=sh3
}
}
public void run() {
while(true) {
updateState();
// then do tons of stuff that uses my1,my2,my3 over and over...
...
}
}
}
這個邏輯的任何漏洞?有沒有一種「標準化」或更聰明的方式來做到這一點?如果有大量的狀態變量呢?更糟糕的是,如果狀態變量是不容易複製的自定義對象(例如,在Java中,自定義對象的變量是引用)?
順便說一下,這來自我目前在Android中使用SurfaceView的工作。
這是打包這個過程的好方法(並且沒有任何明確的同步---獎金!)。謝謝! (我碰巧在你的文章後面閱讀了Java併發實踐中的這一章。) – heycosmo 2011-06-13 07:05:18
我還沒有閱讀「實踐中的Java併發性」,但可能我從其他幾百個地方收集了相同的信息。 :) – 2011-06-14 22:29:52