2

我想从一个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块中访问该方法。我希望增加可读性。

有什么建议吗?

编辑: 我修改了示例以合并评论。

4

3 回答 3

3

如果没有合法的代码路径doHeavyStuff可以在不持有锁的情况下执行,那么一定要通过synchronized来抢占未来由粗心的开发人员引入的任何错误。代码的可读性只能提高什么方式。

于 2013-01-02T11:23:33.083 回答
1

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

assert Thread.holdsLock(this);

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

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

于 2013-01-02T11:17:01.127 回答
0

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

于 2013-01-02T11:17:01.453 回答