首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >您能安全地同步Java方法参数吗?

您能安全地同步Java方法参数吗?
EN

Stack Overflow用户
提问于 2011-06-02 10:06:49
回答 1查看 12.7K关注 0票数 21

请看下面的代码:

代码语言:javascript
复制
public class MyClass {
    private final Object _lock = new Object();
    private final MyMutableClass _mutableObject = new MyMutableClass()

    public void myMethod() {
        synchronized(_lock) { // we are synchronizing on instance variable _lock
            // do something with mutableVar 
            //(i.e. call a "set" method on _mutableObject)
        }
    }
}

现在,想象一下将myMethod()中的代码委托给某个辅助类,在该类中传递锁

代码语言:javascript
复制
public class HelperClass {
    public helperMethod(Object lockVar, MyMutableClass mutableVar) {
        synchronized(lockVar) { // we are now synchronizing on a method param, 
                                // each thread has own copy
            // do something with mutableVar 
            // (i.e. call a "set" method on mutableVar)
        }
    }
}

是否可以通过传递锁变量来重写"myMethod“以使用HelperClass,这样一切都仍然是线程安全的?即,

代码语言:javascript
复制
public void myMethod() {
    _helperObject.helperMethod(_lock, _mutableObject);
}

我不确定这一点,因为Java将通过值传递lockVar,并且每个线程都将获得lockVar的单独副本(即使每个副本指向堆上的相同对象)。我猜问题归结为“synchronized”关键字是如何工作的--它是锁定变量,还是锁定变量引用的堆上的值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-02 10:12:45

同步在 variables.而不是时完成

变量/成员有时包含对象,实际上在synchronized(x)中同步的是变量x中包含的结果对象。

关于变量的线程可见性还有一些其他问题(例如,可能从变量中读取“过时”对象),但这不适用于这里:没有重新分配_lock,并且初始(“最终”)分配的可见性是有保证的。因此,可以保证,在这种情况下,方法参数将始终包含用于同步的正确(相同)对象。

但是,如果使用的锁对象(假设_lock不是最终锁)发生变化,则需要重新计算适当的值/线程可见性,但其他情况与任何跨线程访问没有区别。

祝你编码愉快。

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

https://stackoverflow.com/questions/6209679

复制
相关文章

相似问题

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