58

我有一个 WeakReference 的 Collections.synchronizedList,_components;

我写了如下内容,希望编译器抱怨:

public boolean addComponent2(Component e) {
    synchronized (_components) {
        return _components.add(new WeakReference<Component>(e));
    }        
}

但是编译器完全满意。请注意,List.add() 返回 TRUE。好吧,从同步块的任何退出都会释放锁,但这看起来不奇怪吗?它有点像块中的“洞”,类似于在循环中使用 return。

你愿意维护这样的代码吗?

4

2 回答 2

65

这绝对没问题 - 从循环返回,或者从try具有适当finally块的块返回。您只需要了解语义,此时它就非常有意义。

这肯定比为了它而引入局部变量更简单的代码:

// Ick - method body is now more complicated, with no benefit
public boolean addComponent2(Component e) {
    boolean ret;
    synchronized (_components) {
        ret = _components.add(new WeakReference<Component>(e));
    }
    return ret;
}
于 2011-11-01T19:48:04.480 回答
54

synchronized在块内返回没有错。锁将被正确释放。

于 2011-11-01T19:46:33.860 回答