首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对getter/setter或AtomicReference使用synhronize

对getter/setter或AtomicReference使用synhronize
EN

Stack Overflow用户
提问于 2012-11-09 03:43:45
回答 2查看 539关注 0票数 2

据我所知,这种情况如下:

代码语言:javascript
复制
class Case1{
        private Object object;
        public synchronized Object getObject() {
            return object;
        }
        public synchronized void setObject(Object object) {
            this.object = object;
        }
    }

与以下内容相比,将被视为已弃用:

代码语言:javascript
复制
class Case2{
    private AtomicReference<Object> object = new AtomicReference<Object>();
    public Object getObject() {
        return object.get();
    }
    public void setObject(Object object) {
        this.object.set(object);
    }
}

我说的对吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-09 03:47:40

在这两种情况下,getter和setter中的操作都是原子的(引用赋值)。因此,一个更有效(至少在可读性方面)的习惯用法是:

代码语言:javascript
复制
class Case3 {
    private volatile Object object = new Object();
    public Object getObject() {
        return object;
    }
    public void setObject(Object object) {
        this.object = object;
    }
}

至于你的实际问题,AtomicReference提供了一些简单的原子操作,如果你需要的话,这将使它成为比易失性更好的选择。synchronized使整个块成为原子的,这使您能够以原子的方式进行更复杂的操作。

换句话说,volatileAtomicReferencesynchronized都有自己的特殊性,并不是等价的。

票数 4
EN

Stack Overflow用户

发布于 2012-11-09 05:08:06

易失性应该足够了。AtomicReference添加了更多有用的操作,如getAndSet()和compareAndSet()。但是如果你只做get和set,易失性应该更便宜。

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

https://stackoverflow.com/questions/13296553

复制
相关文章

相似问题

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