在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
块内部返回没有任何问题。 锁将被正确释放。