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

时间:2013-01-02 11:14:42

标签: java concurrency synchronized synchronized-block

我想从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是否合适。恕我直言,这在语义上没有任何区别,因为在两种情况下this都存在锁定,并且保证只能从synchronized块访问该方法。我希望提高可读性。

有什么建议吗?

修改 我修改了示例以包含注释。

3 个答案:

答案 0 :(得分:3)

如果没有合法的代码路径可以在不保持锁定的情况下执行doHeavyStuff,那么 使其成为synchronized以便抢占任何未来的错误由一个不知情的开发人员介绍。代码的可读性只能改进方式。

答案 1 :(得分:1)

最好使用断言来检查锁定是否被保持。注意,您需要启用断言才能执行检查。

assert Thread.holdsLock(this);

通常,如果您使用这种私有方法,则往往表明您应该将该类拆分为两个。外层执行锁定以及可能适用于客户端的其他事项,而更深层更关注实现。

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

答案 2 :(得分:0)

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