繁体   English   中英

同步访问的方法是否应该同步?

[英]Should synchronized accessed methods be synchronized?

我想从synchronized块中访问方法。 这是一个例子:

public void doSomething() {
    // simple stuff

    // a block to reduce the synchronized code to
    // what really needs to be synchronized.
    synchronized(this) {
        if (precondition) {
            doSequentialStuff();
        }
    }
}

private void doSequentialStuff() {
    // do stuff needs to be performed sequentially.
}

为了编写干净的代码,我想知道使doSequentialStuff方法显式synchronized是否会很好。 IMHO此也就没有什么区别在语义由于锁定是在两种情况下this ,并且该方法是保证从仅访问synchronized块。 我希望增加可读性。

有什么建议吗?

编辑:我修改了示例以合并注释。

如果由没有合法的代码路径doHeavyStuff可以不持有锁被执行,然后通过各种手段使其synchronized ,以抢占由不知情的开发者引入的任何未来的错误。 代码的可读性只能提高哪种方式。

最好使用一个断言来检查锁是否被持有。 注意,您确实需要启用断言才能执行检查。

assert Thread.holdsLock(this);

通常,如果您使用这种私有方法,则它倾向于表明您应将类分为两个类。 外层进行锁定以及可能适合客户端的其他操作,而更深的层则更关注实现。

使用this锁定是可疑的。 通常,最好使用私有的显式锁定对象。

看看http://weblogs.java.net/blog/mason/archive/2006/09/rechecking_doub.html ,它涵盖了类似的模式(以单例为例,但您可以根据自己的情况轻松进行改造) )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM