我想了解一下我最近的多线程思想。这里有:避免使用状态变量副本进行阻塞?
假设我有以下(伪)类,它的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