代理将从多个线程调用,Proxy.setWorker()可能在某个时候被调用,有人知道下面的实现是否会导致问题吗?
class Worker {
void methodA() {
...
}
void methodB() {
...
}
};…和…
class Proxy {
volatile Worker mWorker;
final boolean cond= true;
public void setWorker(Worker worker) {
mWorker = worker;
}
void methodA() {
if(cond)
mWorker.methodA();
}
void methodB() {
if(cond)
mWorker.methodB();
}
}发布于 2022-07-26 06:16:06
如果有两个线程对同一个字段执行读/写或写/写,并且这些读/写不是按照发生的顺序排列的--在关系之前(所以没有发生--在它们之间的边缘之前),您就会得到数据竞赛。
“worker”字段是不稳定的,因此由于易失性变量规则,在边缘之前发生了一个事件;因此,不存在数据竞争。
如果可能的话,我会把'cond‘字段设置为决赛,以防止混淆。如果您要修改“cond”字段,那么您的代码可能有一个数据竞争,除非您使其易失性。
发布于 2022-07-20 21:18:43
这取决于每个线程是否有一个单独的代理。如果你这么做了,你会没事的。如果您不这样做,并且在同一位置尝试从两个位置调用setWorker,或者在设置worker时尝试并调用其中一个方法,或者如果其中一个方法修改代理或worker,则会出现一些数据争用问题。
https://stackoverflow.com/questions/73057743
复制相似问题