请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

Semaphore和CountDownLatch的释放应该都放在finally块中吧

不然中间出现异常不就会导致无法结束线程了吗?

正在回答 回答被采纳积分+3

1回答

Jimin 2018-10-20 11:23:59

你好,释放锁那步关键是保证能执行,虽然可能出现异常,但如果你之前已经确保能捕获可能出现的异常时,是否放在finally里都没什么问题,只是释放锁放在finally里你会感觉更放心一些。有时候这个类变量被放到其他类属性里以及放在复杂的环境里,不一定有合适的finally点,保证能处理掉所有异常及应对才关键。
举一个复杂点的情况,我们系统在做数据一致性时,有时遇到一些网络异常,尽管做try...catch了,但是网络异常带来的影响并没消除,因此会先记到本地,然后通过不断重试来保证在网络正常后执行,而之前出问题的点需要先行放过。这时有些finally里执行的语句就需要仔细考量一下,是否需要等到重试成功时再执行。

0 回复 有任何疑惑可以回复我~
  • 提问者 MrLw #1
    我还是觉得放finally是一种规范的问题,应该是放在最顶层的try-catch,如果有对个别异常有重试、修复机制的话,应该是在内部完成,最外层接收的异常应该属于意料之外,无法处理的问题,放在finally是保证线程能够继续,比如我有1000个线程,200个一起并发,这时候200个都异常,最终程序会只跑200个,因为没有释放。即使网络正常,在不重启的情况下依然会停在哪里。不是吗?
    回复 有任何疑惑可以回复我~ 2018-10-20 11:35:33
  • Jimin #2
    对于finally的使用,这确实属于规范,但不是所有场合都必须使用这个finally才符合规范,这是我想表达的意思,比如apache 里有个chain+command的设计,多个command组成一个chain挨个执行,每个都会执行到。很多设计里都可见到这种的,责任链模式里出现的更多。
    
    对于这些组件而言,他们核心是找到合适的点去执行释放锁就ok,之前见过一些项目的设计是在一个方法执行前后植入before和after操作,before时加锁,释放锁的操作也是写在after里面,而不是借助看到方法执行里的try...catch。当然,对于绝大部分场景,你这样也是一点问题没有
    回复 有任何疑惑可以回复我~ 2018-10-20 12:19:34
  • 提问者 MrLw 回复 Jimin #3
    明白了,谢谢老师
    回复 有任何疑惑可以回复我~ 2018-10-23 09:11:04
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信