加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何确保多个线程可以安全地访问类字段?

发布时间:2020-12-14 05:31:41 所属栏目:Java 来源:网络整理
导读:当通过多个线程通过getter方法访问类字段时,您如何维护线程安全性?同步关键字是否足够? 这是安全的吗? public class SomeClass { private int val; public synchronized int getVal() { return val; } private void setVal(int val) { this.val = val; }}
当通过多个线程通过getter方法访问类字段时,您如何维护线程安全性?同步关键字是否足够?

这是安全的吗?

public class SomeClass {
    private int val;

    public synchronized int getVal() {
        return val;
    }

    private void setVal(int val) {
        this.val = val;
    }
}

或者是否引入更多的并发症?

解决方法

如果在这里也在setter上使用’synchronized’,这个代码是线程安全的.然而,它可能不够粒度;如果您有20个getter和setter,并且它们都已同步,则可能会创建同步瓶颈.

在这个具体的例子中,使用一个单一的int变量,然后消除’synchronized’并标记int字段’volatile’也将确保可见性(每个线程在调用getter时都会看到最新的’val’值),但它可能不会根据您的需要进行同步化.例如,期待

int old = someThing.getVal();
 if (old == 1) {
    someThing.setVal(2);
 }

将val设置为2,如果且仅当它已经是1是不正确的.为此,您需要一个外部锁定或一些原子比较和设置方法.

我强烈建议您阅读Brian Goetz等人的Java并发实践,它具有Java并发结构的最佳覆盖.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读