我想从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
块访问该方法。我希望提高可读性。
有什么建议吗?
修改 我修改了示例以包含注释。
答案 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,它已经覆盖了类似的模式(以单例作为示例,但您可以轻松地根据您的情况对其进行改造)。