Java return 与finally
public Map<String, Set<NearFinderData>> getDataMap() { Map<String, Set<NearFinderData>> latestData = null; lock.readLock().lock(); try { latestData = NEAR_FINDER_DATA; } finally { lock.readLock().unlock(); } return latestData; }
和
public Map<String, Set<NearFinderData>> getDataMap() { lock.readLock().lock(); try { return NEAR_FINDER_DATA; } finally { lock.readLock().unlock(); } }
的区别是什么呢?其中NEAR_FINDER_DATA 是一个被修改的Map
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
两者有一些区别,我想你可以运行看看这个例子,就可以理解了
这个例子的运行结果是
为什么在finally中都是改变的同一个变量,两者的结果会不一样呢。其实你要看它翻译成jvm的byte code就可以很好的理解了。在
test1
中实际上在return之前book变量已经被从stack中弹出,然后被压入一个return的stack准备弹出了,这个时候再跳入finally
中的代码,无论它怎么改变book的值,但是因为最终返回的是return的stack中的最顶上的那个值,所以也不会对最终结果造成改变,因为这是两个不同的堆栈。如果你对
test1
中的代码稍加改进,把finally
中的代码改成return 2
,那么test1的结果也是2了。这时候并不是优先执行finally
中的return 2
这么简单(虽然你也可以简单的这么理解),但实际上是它把2压入了return的stack,最后再跳回try中的return语句,这时候return的堆栈最顶上的值已经变成2了,所以return出来就是2了。Java的finally在任何情况下都会被调用,System.exit()除外。
所以,两个区别就是一个先解锁后返回,一个先返回后解锁