在Java中,同步块内的返回值看起来很糟糕。 真的有关系吗?

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

我写了类似下面的内容,希望编译器能够抱怨:

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

但编译器非常满意。 请注意List.add()返回TRUE。 所以好吧,从同步块的任何退出释放锁,但不看这个怪? 这有点像块中的“洞”,类似于循环中的返回。

你会喜欢这样的代码吗?

这是绝对没问题的,就像是从一个循环返回,或者从一个具有合适的finally块的try块中返回。 你只需要知道语义,在这一点上它是非常有意义的。

这当然比简单的代码引入一个局部variables的缘故:

 // 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; } 

synchronized块内部返回没有任何问题。 锁将被正确释放。