我希望能就我最近的一个多线程想法得到一些智慧。具体如下:
假设我有以下(伪代码)类,其
在这种情况下,拥有2个状态变量的副本似乎可以防止很多潜在的阻塞(因为如果我只有一个共享状态变量的副本,我必须在while循环中同步所有内容(使用
假设我有以下(伪代码)类,其
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时遇到的问题。
stateLock
原子化了状态设置和获取。 - heycosmo