首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发处理正确吗?

并发处理正确吗?
EN

Stack Overflow用户
提问于 2022-07-20 20:24:11
回答 2查看 55关注 0票数 0

代理将从多个线程调用,Proxy.setWorker()可能在某个时候被调用,有人知道下面的实现是否会导致问题吗?

代码语言:javascript
复制
class Worker {
    void methodA() {
        ...
    }
    
    void methodB() {
        ...
    }
};

…和…

代码语言:javascript
复制
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();
    }       
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-26 06:16:06

如果有两个线程对同一个字段执行读/写或写/写,并且这些读/写不是按照发生的顺序排列的--在关系之前(所以没有发生--在它们之间的边缘之前),您就会得到数据竞赛。

“worker”字段是不稳定的,因此由于易失性变量规则,在边缘之前发生了一个事件;因此,不存在数据竞争。

如果可能的话,我会把'cond‘字段设置为决赛,以防止混淆。如果您要修改“cond”字段,那么您的代码可能有一个数据竞争,除非您使其易失性。

票数 0
EN

Stack Overflow用户

发布于 2022-07-20 21:18:43

这取决于每个线程是否有一个单独的代理。如果你这么做了,你会没事的。如果您不这样做,并且在同一位置尝试从两个位置调用setWorker,或者在设置worker时尝试并调用其中一个方法,或者如果其中一个方法修改代理或worker,则会出现一些数据争用问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73057743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档